首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >WooCommerce自定义分页不会根据每个页面选项值获取产品。

WooCommerce自定义分页不会根据每个页面选项值获取产品。
EN

Stack Overflow用户
提问于 2022-01-06 07:46:18
回答 1查看 110关注 0票数 0

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

代码语言:javascript
复制
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方法中使用此方法。

EN

回答 1

Stack Overflow用户

发布于 2022-02-10 10:27:10

代码语言:javascript
复制
 /*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',
        ];
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70603933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档