在 Woocommerce 中将 Avada Catalog 排序挂钩覆盖回默认值
Override Avada Catalog sorting hook back to default in Woocommerce
我正在尝试通过将以下代码添加到 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 商店页面订购框使用自己的挂钩:
/**
* 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 支持说我可以从此挂钩中删除 Avada 功能并使用子主题添加我自己的功能。
add_action( 'woocommerce_get_catalog_ordering_args', array( $this,
'get_catalog_ordering_args' ), 20 );
我搜索了整个互联网寻求帮助,我发现很多人问了几乎相同的问题但没有答案。
如果有人可以帮助删除 avada 功能,那将对我和其他正在寻找它的人非常有帮助。
如何从 woocommerce_get_catalog_ordering_args
动作挂钩中删除 Avada 挂钩函数?
经过多次测试,我发现了以下由 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 Date';而不是 $orderby = 'date';
这只是我强迫 avada 使用我自己的自定义顺序而不是日期。
但这并不是我修改后的真正实用的解决方案 class-avada-woocommerce.php
是否有任何建议通过向 avada child 添加一些代码来找到解决方案
更新二:
我认为如果你添加一个比 Avada 的主题挂钩更高的优先级它就会起作用(这里我将它设置为 100
),并且在这个函数中唯一要做的改变是 $args['orderby'] = 'menu_order date';
获得您对 Avada 文件所做的类似更改。
代码:
add_filter( 'woocommerce_get_catalog_ordering_args', 'custom_catalog_ordering_args', 100 );
function custom_woocommerce_get_catalog_ordering_args( $args ) {
$args['orderby'] = 'menu_order date';
return $args;
}
此代码位于您的活动子主题的 function.php 文件中。
它应该有效
非常奇怪的是woocommerce_get_catalog_ordering_args
is a filter hook,但是不是动作挂钩(所以我更改了我的代码)...
Then something is wrong in the Avada's theme code and you should report it to the support.
你只需要增加你的钩子函数,它就会覆盖 Avada 的:
add_action('after_setup_theme', 'remove_avada_function' );
function remove_avada_function(){
remove_action( 'woocommerce_before_shop_loop', 'catalog_ordering', 30 );
add_action( 'woocommerce_before_shop_loop', 'custom_catalog_ordering', 30 );
}
Avada 代码没有问题。
Avada 故意解开过滤器 'woocommerce_get_catalog_ordering_args' 并在其中写入自己的过滤器“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”挂钩在'after_setup_theme'上,用于解除挂钩。但是,由于 'remove_avada_function' 在调用操作 'pre_get_post' 之前被调用,因此 'remove_avada_function' 不会删除当前不存在的操作。
我正在尝试通过将以下代码添加到 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 商店页面订购框使用自己的挂钩:
/**
* 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 支持说我可以从此挂钩中删除 Avada 功能并使用子主题添加我自己的功能。
add_action( 'woocommerce_get_catalog_ordering_args', array( $this,
'get_catalog_ordering_args' ), 20 );
我搜索了整个互联网寻求帮助,我发现很多人问了几乎相同的问题但没有答案。
如果有人可以帮助删除 avada 功能,那将对我和其他正在寻找它的人非常有帮助。
如何从 woocommerce_get_catalog_ordering_args
动作挂钩中删除 Avada 挂钩函数?
经过多次测试,我发现了以下由 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 Date';而不是 $orderby = 'date';
这只是我强迫 avada 使用我自己的自定义顺序而不是日期。
但这并不是我修改后的真正实用的解决方案 class-avada-woocommerce.php
是否有任何建议通过向 avada child 添加一些代码来找到解决方案
更新二:
我认为如果你添加一个比 Avada 的主题挂钩更高的优先级它就会起作用(这里我将它设置为 100
),并且在这个函数中唯一要做的改变是 $args['orderby'] = 'menu_order date';
获得您对 Avada 文件所做的类似更改。
代码:
add_filter( 'woocommerce_get_catalog_ordering_args', 'custom_catalog_ordering_args', 100 );
function custom_woocommerce_get_catalog_ordering_args( $args ) {
$args['orderby'] = 'menu_order date';
return $args;
}
此代码位于您的活动子主题的 function.php 文件中。
它应该有效
非常奇怪的是woocommerce_get_catalog_ordering_args
is a filter hook,但是不是动作挂钩(所以我更改了我的代码)...
Then something is wrong in the Avada's theme code and you should report it to the support.
你只需要增加你的钩子函数,它就会覆盖 Avada 的:
add_action('after_setup_theme', 'remove_avada_function' );
function remove_avada_function(){
remove_action( 'woocommerce_before_shop_loop', 'catalog_ordering', 30 );
add_action( 'woocommerce_before_shop_loop', 'custom_catalog_ordering', 30 );
}
Avada 代码没有问题。
Avada 故意解开过滤器 'woocommerce_get_catalog_ordering_args' 并在其中写入自己的过滤器“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”挂钩在'after_setup_theme'上,用于解除挂钩。但是,由于 'remove_avada_function' 在调用操作 'pre_get_post' 之前被调用,因此 'remove_avada_function' 不会删除当前不存在的操作。