gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:47:07 25 4
gpt4 key购买 nike

我正在尝试通过将以下代码添加到 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com