WooCommerce-页面重新加载后每页结果不起作用

时间:2013-09-30 作者:Grávuj Miklós Henrich

我想要实现的是在自定义页面上列出一些属于两个常见类别的产品。除了“每页结果”下拉列表外,此部分工作正常。当我将下拉列表值更改为24/36/48时,页面重新加载后,显示的产品数量与初始页面加载上的产品数量相同。

我有以下代码:

$wp_query = new WP_Query(
    array(
        \'post_type\' => \'product\',
        \'tax_query\' => array(
            \'relation\' => \'AND\',
                array(
                    \'taxonomy\'  => \'product_cat\',
                    \'field\'     => \'slug\',
                    \'terms\'     => \'new-arrivals\'
                ),
                array(
                    \'taxonomy\'  => \'product_cat\',
                    \'field\'     => \'slug\',
                    \'terms\'     => \'earrings\'
                )
            )
    )
);
while ( $wp_query->have_posts() ) : $wp_query->the_post();
woocommerce_get_template( \'archive-product.php\' );
endwhile;
wp_reset_postdata();
wp_link_pages(array(\'before\' => \'<p><strong>Pages:</strong> \', \'after\' => \'</p>\', \'next_or_number\' => \'number\'));
我想了解一些关于如何定制循环以满足每页结果功能的指导。我知道我错过了发送和获取下拉列表值的过程,但我还不知道如何使用最佳实践,而不是残酷的PHP和JS。一定有一些WooCommerce风格的最佳实践。如果我的代码可以定制,或者我完全走错了路。如果是的话,我是在哪里犯的错误?

我以为这是会很简单的一个,没有注意到“每页帖子”的细节。

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

让我们想象一下,您得到了如下下拉列表

// The template tag that you place in your ... template
function WPSE116198PerPageSelect()
{
    $selected = 
    <?php
    <select name="woo_per_page" id="woo_per_page" size="3">
        <?php
        foreach ( array( 24, 36, 48 ) as $val )
        {
            ?><option <?php value="<?php echo $val; ?> selected( get_query_var( \'woo_per_page\' ), $val ); ?>>
                <?php echo $val; ?>
            </option><?php
        }
        ?>
    </select>
    ?>
}
那么我们需要回拨pre_get_posts:

add_action( \'pre_get_posts\', \'WPSE116198PerPageCb\' );
function WPSE116198PerPageCb( $query )
{
    if (
        isset( $_POST[\'woo_per_page\'] )
        AND in_array( absint( $_POST[\'woo_per_page\'] ) ), array( 24, 36, 48 ) )
        )
    {
        $per_page = absint( esc_attr( $_POST[\'woo_per_page\'] ) );
        $query->set( \'posts_per_page\', $per_page );
    }

    return $query;
}
这段代码没有经过测试,我不是WooCommerce专家,您也可以考虑offset, 这个numpostspaged/page 用于分页。

SO网友:Grávuj Miklós Henrich

临时“残酷”PHP训练:

if ( $_POST[\'woocommerce-sort-by-columns\'] ) {
    $wsbc = $_POST[\'woocommerce-sort-by-columns\'];
} else {
    $wsbc = \'9\';
}
$wp_query = new WP_Query(
    array(
        \'post_type\' => \'product\',
        \'tax_query\' => array(
            \'relation\' => \'AND\',
                array(
                    \'taxonomy\'  => \'product_cat\',
                    \'field\'     => \'slug\',
                    \'terms\'     => \'new-arrivals\'
                ),
                array(
                    \'taxonomy\'  => \'product_cat\',
                    \'field\'     => \'slug\',
                    \'terms\'     => \'rings\'
                )
            ),
        \'posts_per_page\' => $wsbc
    )
);
while ( $wp_query->have_posts() ) : $wp_query->the_post();
woocommerce_get_template( \'archive-product.php\' );
endwhile;
wp_reset_postdata();
wp_link_pages(array(\'before\' => \'<p><strong>Pages:</strong> \', \'after\' => \'</p>\', \'next_or_number\' => \'number\'));
但我几乎可以肯定,必须有一个最佳实践解决方案。

结束