【问题标题】:WooCommerce custom pagination is not fetching products according to post per page option valueWooCommerce 自定义分页未根据每页帖子选项值获取产品
【发布时间】:2022-02-10 18:27:10
【问题描述】:

WooCommerce 分页不会根据每页帖子选项值获取产品。单击分页链接时显示不同的产品,有时在单击分页链接时显示正确的产品数量,但有时不显示。相同的查询适用于所有自定义分页。 这是我的代码:

public function render()
    {
        global $wp_query, $wp_rewrite;
        $args= [];
        $ordering_args =[];
        $pagination_args =[];
        $taxonomy   = 'product_cat';
      
        $args = array(
            'post_type'           => 'product',
            'post_status'         => 'publish',
            'posts_per_page'      =>  absint(get_option('posts_per_page')),
        );
      
      
        if (isset($_POST['orderby'])) {
            if ('price-desc' === $_POST['orderby']) {
                $args['orderby'] = 'price';
                $args['order']   = 'DESC';
            } elseif ('price' === $_POST['orderby']) {
                $args['orderby'] = 'price';
                $args['order']   = 'ASC';
            } elseif ('date' === $_POST['orderby']) {
                $args['orderby'] = 'date';
                $args['order']   = 'DESC';
            } else {
                $args['orderby'] = $_POST['orderby'];
                $args['order'] ='';

            }

            $ordering_args = WC()->query->get_catalog_ordering_args($args['orderby'], $args['order']);
            $args['orderby'] = $ordering_args['orderby'];
            $args['ordering_args']   = $ordering_args;
            $args['order']   = $ordering_args['order'];
            if ($ordering_args['meta_key']) {
                $args['meta_key'] = $ordering_args['meta_key'];
            }
        }else{
            $ordering_args = WC()->query->get_catalog_ordering_args();
            $args['orderby'] = $ordering_args['orderby'];
            $args['ordering_args']   = $ordering_args;
            $args['order']   = $ordering_args['order'];
            if ($ordering_args['meta_key']) {
                $args['meta_key'] = $ordering_args['meta_key'];
            }
        }
        
        if (isset($_POST['paged'])) {
            $args['paged'] = absint($_POST['paged']);
            if (1 < absint($_POST['paged'])) {
                $args['paged'] = absint($_POST['paged']);
            }
            $pagination_args = array(
                'total'   => wc_get_loop_prop('total_pages'),
                'current' =>absint($_POST['paged']),
            );
            $args['limit'] = isset($args['posts_per_page']) ? intval($args['posts_per_page']) : intval(get_option('posts_per_page'));

            if (empty($args['offset'])) {
               $args['offset'] = 1 < $args['paged'] ? ($args['paged'] - 1) * $args['limit'] : 0;
            }
        }

       
      
        if (!empty($args['meta_query'])) {
            if (!empty($_POST['rating'])) {
                $args['meta_query']['relation'] ='AND';
                $rating = $_POST['rating'];
                $args['meta_query'][]= array(
                    'key'     => '_wc_average_rating',
                    'value'   => array( (int)$rating[0],  (int)$rating[1] ),
                    'compare' => 'BETWEEN',
                    'type'    => 'numeric'
                );
            }
        } else {
            if (!empty($_POST['rating'])) {
                $rating = $_POST['rating'];
                $args['meta_query']= array(
                array(
                    'key'     => '_wc_average_rating',
                    'value'   => array( (int)$rating[0],  (int)$rating[1] ),
                    'compare' => 'BETWEEN',
                    'type'    => 'numeric'
                )
            );
            }
        }
    
        if (!empty($_POST['product-cata'])) {
            $category = $_POST['product-cata'];
            $args['tax_query']= array(
            array(
                'taxonomy'   =>  $taxonomy,
                'field'      => 'term_id',
                'terms'      =>  (int)$category
            )
        );
        }else{
            if (!empty($_POST['category'])) {
                $category = $_POST['category'];
                $args['tax_query']= array(
                array(
                    'taxonomy'   =>  $taxonomy,
                    'field'      => 'term_id',
                    'terms'      =>  (int)$category
                )
            );
            }

        }

        $wp_query = new WP_Query($args);
      
        if ($wp_query->have_posts()) {
            ob_start();
            // do_action('woocommerce_before_shop_loop');

            woocommerce_product_loop_start();


            while ($wp_query->have_posts()) {
                $wp_query->the_post();
                /**
                 * Hook: woocommerce_shop_loop.
                 */
                do_action('woocommerce_shop_loop');
                echo wc_get_template_part('content', 'product');
            }

            woocommerce_product_loop_end();
          
            //do_action('woocommerce_after_shop_loop');
        
            wp_reset_postdata();
            $_RESPONSE['posted_data'] =$_POST;
            $_RESPONSE['products'] = ob_get_contents();
            ob_end_clean();
            if (isset($_POST['paged'])) {
                $paged = (int) $_POST['paged'];
                $base = $_POST['link'].'page/%#%';
                $pagination_args = array(
                    'base'    =>  $base,
                    'total'   => (int)$wp_query->max_num_pages,
                    'per_page' => (int)get_option('posts_per_page'),
                    'current' => (int) max(1,  $paged),
                    'format' => '',
                );
                $_RESPONSE['pagination'] =  $this->custom_woocommerce_pagination($pagination_args);
                $_RESPONSE['result_counts'] =  $this->custom_result_count($pagination_args);
            } else {
                $base = $_POST['link'].'page/%#%';
                $pagination_args = array(
                    'base'    =>  $base,
                    'total'   =>(int) $wp_query->max_num_pages,
                    'per_page' =>(int) get_option('posts_per_page'),
                    'current' => (int) max(1, 1),
                    'format' => '',
                );
                $_RESPONSE['pagination'] =  $this->custom_woocommerce_pagination($pagination_args);
                $_RESPONSE['result_counts'] =  $this->custom_result_count($pagination_args);
            }
            $_RESPONSE['args'] = $args;
            $_RESPONSE['pagination_args'] = $pagination_args;

        } else {
            ob_start();
            do_action('woocommerce_no_products_found');
            $_RESPONSE['products'] = ob_get_contents();
            $_RESPONSE['args'] = $args;
            ob_end_clean();
        }
        echo json_encode($_RESPONSE);
        die();
    }

 

任何帮助将不胜感激。我在 ajax post 方法中使用它。

【问题讨论】:

    标签: woocommerce pagination


    【解决方案1】:
     /*Display only in stock*/
        $args['meta_query'][]= [
            'key' => '_stock_status',
            'value' => 'instock'
        ];
        /*Display only visible product*/
        $args['tax_query'][]= [
                'taxonomy'  => 'product_visibility',
                'terms'     => array( 'exclude-from-catalog' ),
                'field'     => 'name',
                'operator'  => 'NOT IN',
            ];
    

    【讨论】:

    • 我在我的代码中发现了一个逻辑错误。我还没有检查产品的库存状态和产品可见性。
    猜你喜欢
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多