php - 在 Woocommerce 中将 Avada Catalog 排序 Hook 覆盖回默认值

标签 php wordpress function woocommerce hook

我正在尝试通过将以下代码添加到 Avada 子 function.php 文件来修改 Woocommerce 排序选项以获得自定义排序选项:

    // add custom sorting option 
   add_filter( 'woocommerce_get_catalog_ordering_args', 
  'custom_woocommerce_get_catalog_ordering_args' );

  function custom_woocommerce_get_catalog_ordering_args( $args ) {
  $orderby_value = isset( $_GET['orderby'] ) ? woocommerce_clean( 
  $_GET['orderby'] ) : apply_filters( 'woocommerce_default_catalog_orderby', 
  get_option( 'woocommerce_default_catalog_orderby' ) );

  if ( 'random_list' == $orderby_value ) {
 $args['orderby'] = 'menu_order Date';
    $args['order'] = 'ASC';
    $args['meta_key'] = '';
    }

return $args;
}

add_filter( 'woocommerce_default_catalog_orderby_options', 
'custom_woocommerce_catalog_orderby' );
 add_filter( 'woocommerce_catalog_orderby', 
 'custom_woocommerce_catalog_orderby' );

 function custom_woocommerce_catalog_orderby( $sortby ) {
$sortby['random_list'] = 'Menu_order_date';
return $sortby;
}
//end custom ordering code 

如果我没有启用 WooCommerce 商店页面订购框并且实际上我希望订购框显示在我的商店页面和产品类别上,此代码工作正常,所以我联系 Avada 支持解决这个问题,结果证明 Avada 使用他们自己的 WooCommerce 商店页面订购框 Hook ,代码如下:

/**
 * Controls the actions adding the ordering boxes.
 *
 * @access public
 * @since 5.0.4
 * @param object $query The main query.
 * @return void
 */
public function product_ordering( $query ) {

    // We only want to affect the main query.
    if ( ! $query->is_main_query() || $query->is_search() ) {
        return;
    }

    if ( $query->get( 'page_id' ) ) {
        $page_id = absint( $query->get( 'page_id' ) );
    } else {
        $page_id = absint( Avada()->fusion_library->get_page_id() );
    }

    if ( wc_get_page_id( 'shop' ) === $page_id || $query->is_post_type_archive( 'product' ) || $query->is_tax( get_object_taxonomies( 'product' ) ) ) {

        if ( Avada()->settings->get( 'woocommerce_avada_ordering' ) ) {
            remove_action( 'woocommerce_before_shop_loop', 'woocommerce_catalog_ordering', 30 );
            add_action( 'woocommerce_before_shop_loop', array( $this, 'catalog_ordering' ), 30 );

            add_action( 'woocommerce_get_catalog_ordering_args', array( $this, 'get_catalog_ordering_args' ), 20 );
        }
    }
}

Avada 支持人员说我可以从此 Hook 中删除 Avada 功能并使用子主题添加我自己的功能。

 add_action( 'woocommerce_get_catalog_ordering_args', array( $this, 
'get_catalog_ordering_args' ), 20 );

我搜索了整个 interent 寻求帮助,我发现很多人问了几乎相同的问题但没有答案。

如果有人可以帮助删除 avada 功能,那将对我和其他正在寻找该功能的人非常有帮助。

如何从 woocommerce_get_catalog_ordering_args 操作 Hook 中删除 Avada Hook 函数?

经过多次测试,我发现了 Avada 团队添加的以下代码:

/**
 * Modified the ordering of products.
 *
 * @access public
 * @since 5.1.0
 */
public function catalog_ordering() {
    get_template_part( 'templates/wc-catalog-ordering' );
}

/**
 * Gets the catalogue ordering arguments.
 *
 * @access public
 * @since 5.1.0
 * @param array $args The arguments.
 * @return array
 */
function get_catalog_ordering_args( $args ) {
    global $woocommerce;
    $woo_default_catalog_orderby = get_option( 'woocommerce_default_catalog_orderby' );

    // Get the query args.
    if ( isset( $_SERVER['QUERY_STRING'] ) ) {
        parse_str( sanitize_text_field( wp_unslash( $_SERVER['QUERY_STRING'] ) ), $params );
    }

    // Get order by.
    $pob = ( ! empty( $params['product_orderby'] ) ) ? $params['product_orderby'] : $woo_default_catalog_orderby;

    // Get order.
    $po = 'asc';
    if ( isset( $params['product_order'] ) ) {
        // Dedicated ordering.
        $po = $params['product_order'];
    } else {
        // Get the correct default order.
        $po = 'asc';
        if ( 'date' === $pob || 'popularity' === $pob || 'rating' === $pob || 'price-desc' === $pob ) {
            $po = 'desc';
        }
    }

    // Remove posts_clause filter, if default ordering is set to rating or popularity to make custom ordering work correctly.
    if ( 'default' !== $pob ) {
        if ( 'popularity' === $woo_default_catalog_orderby || 'rating' === $woo_default_catalog_orderby ) {
            WC()->query->remove_ordering_args();
        }
    }

    $orderby  = 'date';
    $order    = strtoupper( $po );
    $meta_key = '';

    switch ( $pob ) {
        case 'menu_order':
        case 'default':
            $orderby  = $args['orderby'];
            break;
        case 'date':
            $orderby  = 'date';
            break;
        case 'price':
        case 'price-desc':
            add_filter( 'posts_clauses', array( $this, 'order_by_price_post_clauses' ) );
            add_action( 'wp', array( $this, 'remove_ordering_args_filters' ) );
            break;
        case 'popularity':
            $meta_key = 'total_sales';
            add_filter( 'posts_clauses', array( $this, 'order_by_popularity_post_clauses' ) );
            add_action( 'wp', array( $this, 'remove_ordering_args_filters' ) );
            break;
        case 'rating':
            $meta_key = '_wc_average_rating';
            $orderby  = array(
                'meta_value_num' => strtoupper( $po ),
                'ID'             => 'ASC',
            );
            break;
        case 'name':
            $orderby  = 'title';
            break;
    }

    $args['orderby']  = $orderby;
    $args['order']    = $order;
    $args['meta_key'] = $meta_key;

    return $args;
}

如果我只是修改以下内容:

    // Remove posts_clause filter, if default ordering is set to rating or popularity to make custom ordering work correctly.
    if ( 'default' !== $pob ) {
        if ( 'popularity' === $woo_default_catalog_orderby || 'rating' === $woo_default_catalog_orderby ) {
            WC()->query->remove_ordering_args();
        }
    }

    $orderby  = 'date';
    $order    = strtoupper( $po );
    $meta_key = '';

    // Remove posts_clause filter, if default ordering is set to rating or popularity to make custom ordering work correctly.
    if ( 'default' !== $pob ) {
        if ( 'popularity' === $woo_default_catalog_orderby || 'rating' === $woo_default_catalog_orderby ) {
            WC()->query->remove_ordering_args();
        }
    }

    $orderby  = 'menu_order Date';
    $order    = strtoupper( $po );
    $meta_key = '';

$orderby = 'menu_order 日期';而不是 $orderby = 'date';

这只是强制 avada 使用我自己的自定义顺序而不是日期。

但是当我修改 class-avada-woocommerce.php 时,这并不是真正实用的解决方案

是否有任何建议通过向 avada child 添加一些代码来找到解决方案

最佳答案

Avada 代码没有任何问题。

Avada 有意解除过滤器 'woocommerce_get_catalog_ordering_args' 的钩子(Hook)并在其中写入自己的过滤器“catalog_ordering” '/wp-content/themes/Avada/includes/class-avada-woocommerce.php'

那个电话

'/wp-content/themes/Avada/templates/wc-catalog-ordering.php'

请使用您的子主题覆盖模板并复制 wc-catalog-ordering.php 的内容。

即“/wp-content/themes/Avada-Child-Theme/templates/wc-catalog-ordering.php”

一旦完成,您就可以按照自己的意愿处理订单。

前面提到,“remove_avada_function”函数 Hook 在“after_setup_theme”上,用于移除 Hook 。但是,由于在调用操作“pre_get_post”之前调用了“remove_avada_function”,因此“remove_avada_function”不会删除当前不存在的操作。

关于php - 在 Woocommerce 中将 Avada Catalog 排序 Hook 覆盖回默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47969334/

相关文章:

使用最近的特殊帖子插件进行分页(WordPress)

javascript - 在 Javascript 中对不同 ID 多次使用相同的函数

PHP 多个 Curl 请求

php - 部署 Symfony2 项目

php - 如何在 laravel 中使用嵌套关系列字段对查询结果进行排序?

php - 使用自定义值预归档结帐邮政编码

php - 从 SOAP react 中提取某些元素

php - 如何在视觉 Composer 中使用短代码

c - 在主函数中保持零

php - 如何 $_POST 从 PHP 类别列表函数中选择值?