更改WooCommerce产品排序后我的页脚出现问题

时间:2019-08-27 作者:Mehran Mohammadi

最近,我需要更改产品排序,以便首先查看库存产品,然后再查看缺货产品,我在函数中使用了一个片段来完成这一操作。php文件:

class iWC_Orderby_Stock_Status
{

 public function __construct()
 {
  // Check if WooCommerce is active
  if (in_array(\'woocommerce/woocommerce.php\', apply_filters(\'active_plugins\', get_option(\'active_plugins\')))) {
   add_filter(\'posts_clauses\', array($this, \'order_by_stock_status\'), 2000);
  }
 }

 public function order_by_stock_status($posts_clauses)
 {
  global $wpdb;
  // only change query on WooCommerce loops
  if (is_woocommerce() && (is_shop() || is_product_category() || is_product_tag())) {
   $posts_clauses[\'join\'] .= " INNER JOIN $wpdb->postmeta istockstatus ON ($wpdb->posts.ID = istockstatus.post_id) ";
   $posts_clauses[\'orderby\'] = " istockstatus.meta_value ASC, " . $posts_clauses[\'orderby\'];
   $posts_clauses[\'where\'] = " AND istockstatus.meta_key = \'_stock_status\' AND istockstatus.meta_value <> \'\' " . $posts_clauses[\'where\'];
  }
  return $posts_clauses;
 }
}

new iWC_Orderby_Stock_Status;
现在,我的页脚在产品类别、搜索、商店页面和产品标签中不可见,我不知道发生了什么:D网站URL是:https://lotuslaptop.com

感谢您的回答:)谢谢

1 个回复
最合适的回答,由SO网友:djboris 整理而成

发生此错误可能是因为在重写post子句时未检查post类型。

筛选器回调需要第二个参数,即WP_Query 实例,然后使用它检查post_type 是你需要的。如果不进行检查,您将覆盖网站在这些WooCommerce页面上发布的任何类型的帖子的每个数据库查询。

请尝试使用此已编辑的代码,并在其中检查我的注释:

class iWC_Orderby_Stock_Status
{

    public function __construct()
    {
        // Check if WooCommerce is active
        if ( in_array( \'woocommerce/woocommerce.php\', apply_filters( \'active_plugins\', get_option( \'active_plugins\' ) ) ) ) {
            // Added the fourth parameter 2 for the number of parameters to pass to the callback method
            add_filter( \'posts_clauses\', [ $this, \'order_by_stock_status\' ], 2000, 2 );
        }
    }

    /**
     * @param string[]  $posts_clauses
     * @param \\WP_Query $query
     *
     * @return string[]
     */
    public function order_by_stock_status( $posts_clauses, $query )
    {
        // Bail early if the post_type is not what we need
        if ( $query->get( \'post_type\' ) !== \'product\' ) {
            return $posts_clauses;
        }

        global $wpdb;
        // only change query on WooCommerce loops
        if ( is_woocommerce() && ( is_shop() || is_product_category() || is_product_tag() ) ) {
            $posts_clauses[\'join\'] .= " INNER JOIN $wpdb->postmeta istockstatus ON ($wpdb->posts.ID = istockstatus.post_id) ";
            $posts_clauses[\'orderby\'] = " istockstatus.meta_value ASC, " . $posts_clauses[\'orderby\'];
            $posts_clauses[\'where\'] = " AND istockstatus.meta_key = \'_stock_status\' AND istockstatus.meta_value <> \'\' " . $posts_clauses[\'where\'];
        }

        return $posts_clauses;
    }
}

new iWC_Orderby_Stock_Status;

相关推荐

初学者问题:通过管理Web界面访问Functions.php以导入自定义帖子类型?

是否可以访问这些功能。php文件仅仅使用管理web界面?我正在尝试访问以前创建的(手动编码的)自定义帖子类型,我不得不跳过很多障碍,因为我无法访问函数中的代码。php文件。我已经浏览了很多帮助页面,但建议的步骤似乎总是涉及到函数。php文件(我无法访问)或使用插件中的导入/导出工具,该插件首先创建了自定义帖子类型(据我所知,没有使用任何插件)。这似乎是一个非常基本的问题,但我一辈子都想不出来。任何帮助都将不胜感激!