我试图修改Woocommerce排序选项,以获得一个定制的,通过添加以下代码到Avada子function.php
文件:
// 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函数,并添加我自己的Using Child主题。
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 = '菜单订单日期';而不是$orderby = '日期';
这只是我强迫avada使用我自己的自定义排序,而不是日期。
但这不是真正实用的解决方案,因为我修改了class-avada-woocommerce.php
是否有任何建议通过添加一些代码到avada子对象来找到解决方案
3条答案
按热度按时间a0zr77ik1#
阿瓦达法典没有错。
Avada故意断开过滤器“woocommerce_get_catalog_ordering_args”,并在“/wp-content/themes/Avada/includes/class-avada-woocommerce.php”中写入自己的过滤器“catalog_ordering”
那叫
'/wp-content/themes/avada/模板/wc目录排序. php'
请使用您的子主题并复制wc-catalog-ordering.php中的内容来覆盖模板。
即“/wp-内容/主题/Avada-儿童主题/模板/wc-目录-订单. php”
一旦完成,您就可以按照自己的意愿处理订单。
前面提到过,函数“remove_avada_function”被挂接在“after_setup_theme”上,用于删除挂接。但是,由于“remove_avada_function”是在调用操作“pre_get_post”之前调用的,因此“remove_avada_function”不会删除当前不存在的操作。
kiz8lqtg2#
我认为如果你添加一个比Avada的主题挂钩更高的优先级,它会工作(这里我把它设置为
100
),并且在这个函数中要做的唯一改变是$args['orderby'] = 'menu_order date';
,以获得你在Avada的文件上所做的类似改变。代码:
此代码位于当前子主题的function.php文件中。
应该可以
非常奇怪的是,
woocommerce_get_catalog_ordering_args
是一个过滤器钩子,但不是一个操作钩子(所以我修改了代码)...那么Avada的主题代码中有问题,您应该向支持部门报告。
你只需要增加你的hooked函数,这样它就会覆盖Avada的:
ghg1uchk3#
您可以使用此代码将Avada目录排序挂钩设置回woocommerce默认值。