在 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 排序挂钩覆盖回默认值 的相关文章

  • XP及PHP MYSQL 练级系统

    我已经查看了所有提出的问题和答案 但我似乎找不到最适合我的答案 我想做的是开发一个系统 当用户达到一定的 XP 限制时 系统会进入下一个级别 它显示了下一个 XP 之前需要多少 XP So lvl1 0 gt lvl2 256 gt lvl
  • 使用php在html页面中显示bbcode

    我已经有一个 bbcode 字符串 mybbcode b Hello word b 使用 php 我想在 html 页面中以 html 格式显示它 例如 div gt b hello word b div 基本上其他人已经对你说过了 但是如
  • 如何使用 jquery ajax 将锚点的值发送到 php

    我正在尝试使用 jquery 将几个锚点的值发送到 php 文件 但我没有从 php 脚本中得到回调 div class result div a href value class star Star 5 a a href value cl
  • 如何使用 php imap 将邮件消息移动到文件夹

    我似乎无法将邮件移至已保存的文件夹 这是我的代码 mbox imap open mail server mail port mail folder mail username mail password or die Error openi
  • 重定向而不是 404 错误页面 - 状态代码不起作用 (Nginx)

    我目前正在迁移到 nginx 服务器 我尝试将其放入名为的 404 ErrorDocument 中404 php 如果我现在尝试访问http mydomain com 404 php 这按预期工作 它将我重定向到 Google 但是一旦我尝
  • 在 PHP 中拆分 XML

    我有一个带有根元素和多个项目子元素的合并 xml 像这样的东西
  • 如何在 PHP 中将默认日期设置为波斯日期?

    如何在 PHP 中将默认日期设置为波斯日期 说吧 如果我echo这个功能date Y m d 然后它会显示2018 03 05但我想要1396 12 14波斯日期 请检查 http php net manual en intldatefor
  • $_REQUEST、$_GET、$_POST 哪一个最快?

    这些代码中哪一个会更快 temp REQUEST s or if isset GET s temp GET s else temp POST s REQUEST http php net manual en reserved variabl
  • 用PHP动态生成二维码[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试在我的网站上生成二维码 他们所要做的就是在其中包含一个 URL 我网站上的变量将提供该 URL
  • 使用 DateTime 类计算日期差异时出错

    我正在尝试使用 DateTime 类 php gt 5 3 来计算 2 个日期的差异 手册中的示例简单明了 我尝试了该示例并且效果很好 但如果改变开始和结束日期 就会出现问题 this gt start date 2011 03 01 th
  • Opencart 的 $this->config->get('module_var_name')

    我正在尝试自定义 Opencart 支付模块 我看到很多地方都使用了配置信息 但我找不到任何创建正在使用的变量的内容 我知道在管理页面中 如果我选择 paypal 标准 我可以设置所有 配置 信息 但我找不到强调它的 模型 是否有模型 我希
  • 如何使用php在mysql数据库中添加照片? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我对 PH
  • 如何缓存 twitter api 结果?

    我想缓存 twitter api 结果的结果并将其显示给用户 缓存结果的最佳方法是什么 我正在考虑根据时间限制将结果写入文件 可以吗 还是应该使用任何其他方法 最重要的是 理想的缓存时间是多少 我想显示来自 twitter 的最新内容 但
  • 扫描 PHP 上传的病毒

    我目前正在使用以下代码来扫描作为申请表的一部分上传的文件 safe path escapeshellarg dir file command usr bin clamscan stdout safe path out int 1 exec
  • 如何使 WordPress 主题全宽?

    我尽了最大努力 但无法通过编辑 CSS 使以下主题全宽 屏幕 如果您能向我展示或给我有关此定制的提示 我将不胜感激 http demo mythemeshop com sociallyviral http demo mythemeshop
  • phpstorm xdebug 与 symfony2 项目

    我正在尝试使用 xdebug 和 phpstorm 调试 symfony2 应用程序 我的本地开发环境是Ubuntu 14 04 with apache2 Xdebug版本是2 2 7 我在另一个 php 不是 symfony2 项目上使用
  • 如何使用xquery查找节点并向其添加子节点?

    是否可以使用xpath xquery查询特定的xml节点 然后向其导入 添加子节点 示例 代码取自http codepad org gJ1Y2LjM http codepad org gJ1Y2LjM 这是在类似的问题中提出的 但不相同 1
  • 如何在 kotlin 中检查 lambda 空值

    在 Kotlin 中如何检查 lambda 是否为空 例如 我有这样的签名 onError Throwable gt Unit 我如何区分它的默认值是应用于主体还是应用于此函数的值 您无法测试 lambda 的主体是否为空 因此它不包含源代
  • 聚合函数在数据框中创建不需要的向量

    我在函数中创建数据帧时遇到了一个奇怪的问题 但是 在 data frame 之外使用相同的方法效果很好 这是基本函数 我用它来计算数据集的平均值 标准差和标准误差 aggregateX lt function formula dataset
  • 如何在 PHP >= 5.3 严格模式下向对象添加属性而不产生错误

    这必须很简单 但我似乎找不到答案 我有一个通用的 stdClass 对象 foo没有属性 我想添加一个新属性 bar尚未定义 如果我这样做 foo new StdClass foo gt bar 1234 严格模式下的 PHP 会抱怨 将属

随机推荐