我想要实现的是在自定义页面上列出一些属于两个常见类别的产品。除了“每页结果”下拉列表外,此部分工作正常。当我将下拉列表值更改为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风格的最佳实践。如果我的代码可以定制,或者我完全走错了路。如果是的话,我是在哪里犯的错误?
我以为这是会很简单的一个,没有注意到“每页帖子”的细节。
最合适的回答,由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
, 这个
numposts
和
paged
/
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\'));
但我几乎可以肯定,必须有一个最佳实践解决方案。