在 Woocommerce 中将 Avada Catalog 排序挂钩覆盖回默认值

2024-04-05

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

    // 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 功能,这对我和其他正在寻找该功能的人来说将非常有帮助。

我如何从中删除 Avada hooked 函数woocommerce_get_catalog_ordering_args动作挂钩?

经过多次测试,我发现 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 = '';

to

    // 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 子级添加一些代码来找到解决方案


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”上的,用于移除钩子。但是,由于在调用操作“pre_get_post”之前调用“remove_avada_function”,因此“remove_avada_function”不会删除当前不存在的操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Woocommerce 中将 Avada Catalog 排序挂钩覆盖回默认值 的相关文章

  • Smarty输出空白页

    已解决 模板文件错误 我有这样的 Smarty 设置 require once smarty Smarty class php smarty new Smarty smarty gt compile dir compile dir smar
  • 如何复制 ArrayIterator 以保留其当前迭代位置?

    因为这似乎是我必须做的才能达到这种效果 arr a gt first b gt second iter new ArrayIterator arr Do a bunch of iterations iter gt next new iter
  • 使用 php 获取当前月份的最后 3 个月

    我想获取当前月份最近 3 个月的名称 例如当前月份是八月 所以 我想要六月 七月 八月这样的数据 我已经尝试过这段代码echo date F strtotime 3 months 它只返回六月 如何使用 php 获取当前月份的最后 3 个月
  • 在值中包含换行符

    我有一个 Word 模板 其中 php 代码中定义了值 在PHP代码中 document gt setValue Value1 value1 在word模板中 Value1 如何将包含两个值之间的断线的值包含在单词的值中 Replace n
  • 在 Laravel 5 中截断表

    描述 我有一个充满测试数据的表 有时 我想清除它以获取新数据 我可以在 DBMS 应用程序中执行截断 例如MySQL 工作台 但我试图在我的应用程序中实现它 Goal 创建一个按钮 单击时截断数据库中的表 这是我的步骤 1 声明一条路线 R
  • 阻止注销页面后的后退按钮

    我有 php 注销页面 当用户单击注销链接时 请参阅此页面并重定向到索引页面 但是当单击后退按钮时 我会看到带有用户数据的上一页 当然 当我刷新页面时 我看不到以前的页面和数据 我在单击注销并单击后退按钮后检查了其他代码 drupal 但我
  • 使用 Timber 插件时,wordpress 简单的短代码不会呈现

    我最近接管了一个使用 Timber 我不熟悉 的 WordPress 网站的开发 我正在尝试使用新的插件和随附的短代码 但这当然不起作用 我已经研究这个问题几个小时了 似乎没有一个简单的答案 为了使用像这样的简单短代码 sp faq类别 7
  • 在 Symfony 序列化中更改序列化属性名称

    我正在使用 Symfony 序列化器 效果很好 use Symfony Component Serializer Annotation Groups Groups default notification public function g
  • 使用先前的反向引用作为命名捕获组的名称

    有没有办法使用对先前捕获组的反向引用作为捕获组的名称命名捕获组 这可能不可能 如果不可能 那么这就是一个有效的答案 下列 data description some description preg match data matches p
  • 如何在C中实现带连分数的自然对数?

    这里我有一个小问题 根据这个公式创建一些东西 这就是我所拥有的 但它不起作用 弗兰基 我真的不明白它应该如何工作 我尝试用一 些错误的指令对其进行编码 N 是迭代次数和分数部分 我认为它会以某种方式导致递归 但不知道如何 谢谢你的帮助 do
  • 限制自己超载外部 API 的速率

    我发现了很多信息和脚本示例 展示了如何对 API 用户进行速率限制 但我无法找到任何示例来说明在施加这些限制时如何对您自己的 API 请求进行速率限制 我总是用诸如以下的代码来限制我的脚本sleep or usleep命令 但感觉这是一种低
  • Laravel 5 中的自定义验证器

    我正在将 Laravel 应用程序从 4 升级到 5 但是 我有一个自定义验证器 但无法运行 在L4中 我做了一个验证器 php文件并将其包含在全局 php using require app path validators php 我尝试
  • 如何在 yii2 中使用两个不同的模型登录或切换身份类别?

    我想允许用户从两个不同的模型登录 配置文件 user gt identityClass gt app models User one more class here enableAutoLogin gt false authTimeout
  • WordPress 分页自定义帖子类型

    我有一个名为 新闻 的页面 使用页面模板page newslist php 它应该显示来自自定义帖子类型 也称为新闻 的帖子 我意识到两者具有相同的名称会导致问题 因此在注册自定义帖子类型时 我进行了重写以将其与页面区分开来 rewrite
  • 为什么我的 if 语句没有按我预期的方式工作?

    我正在尝试实现以下目标 我向我的 SQL 数据库询问使用SELECT FROM subjects 这样做之后我要求使用数组mysqli fetch assoc 在那之前一切都很好 现在的问题是 当我尝试在每个循环中修改 genero 的值
  • MySQL PHP邮政编码比较具体距离

    我试图找出比较一个邮政编码 用户提供的 和一大堆其他邮政编码 现在大约有 200 个邮政编码 之间的距离的最有效方法 相对于加载时间 但它会随着时间的推移而增加 我不需要任何精确的东西 只是在球场上 我下载了整个美国的邮政编码 csv 文件
  • suhosin.mt_srand.ignore 在 PHP 中一致洗牌数组的解决方法?

    我有一个 PHP 脚本 需要随机化一个具有一致结果的数组 这样它就可以向用户呈现前几个项目 然后如果他们愿意 他们可以从同一个打乱的集合中提取更多结果 我目前使用的是这个 基于我相信的 Fisher Yates 算法 function sh
  • PHP 数组通过 JSON 转为 jquery 数组

    我有点困惑为什么以下不起作用 get php
  • 如何从父类中获取子类名

    我试图在不需要子类上的函数的情况下完成此任务 这可能吗 我有一种感觉 但我真的很想确定
  • 使用 php-ews(Exchange Web 服务)在特定日期后获取电子邮件

    在我的 PHP 脚本中 我需要弄清楚如何检索指定消息 ID 之后或特定日期之后的所有电子邮件 两者都可以 我只需要检索自上次抓取收件箱以来的新电子邮件 这个收件箱每天收到数千封电子邮件 而且我在 30 天内无法删除任何电子邮件 对于初始导入

随机推荐