一直试图弄清楚如何创建一个循环来支持woocommerce的短代码与分页。
因为目前,我有一个项目,并希望有一个显示某个产品的页面,例如我有50个促销产品,使用这个短代码[sale_products per_page =" 10"]它只是显示10个产品没有分页。有关这个问题的任何想法?
此致
答案 0 :(得分:1)
我采取了另一种方法。我所做的是创建了一个“页面”,它将是一个产品档案(就像商店一样),但仅限于销售产品。我敢肯定,如果不是午夜,我可以把它作为WooCommerce的一个选项,就像商店选项来设置商店,我的帐户页面等等。但为了速度我只是做了一个页面,注意到了其ID并将其硬编码为$sale_page_id
。
首先,当您告诉它您希望商店位于您网站的首页时,我们将模仿WooCommerce的功能。基本上,我们将劫持查询并将其从页面切换到产品档案。
add_action( 'pre_get_posts', 'so_28367762_pre_get_posts' );
function so_28367762_pre_get_posts( $q ) {
// We only want to affect the main query
if ( is_admin() || ! $q->is_main_query() ) {
return;
}
$sale_page_id = 487;
// totally modify the query on the Sale Page
if( isset( $q->queried_object_id ) && $q->queried_object_id === $sale_page_id ) {
$q->set( 'post_type', 'product' );
$q->set( 'page', '' );
$q->set( 'pagename', '' );
if ( isset( $q->query['paged'] ) ) {
$q->set( 'paged', $q->query['paged'] );
}
// Fix for verbose page rules
if ( $GLOBALS['wp_rewrite']->use_verbose_page_rules ) {
// Fix conditional Functions
$q->is_archive = true;
$q->is_post_type_archive = true;
$q->is_singular = false;
$q->is_page = false;
}
WC()->query->product_query( $q );
// We're on a shop page so queue the woocommerce_get_products_in_view function
add_action( 'wp', array( WC()->query, 'get_products_in_view' ), 2);
// And remove the pre_get_posts hook
WC()->query->remove_product_query();
}
}
然后我们将修改产品查询,以便它只返回正在销售的商品。我尝试在上面直接添加它,但它不起作用,因为post__in
从product_query()
方法中的scratch / null开始。我添加了相同的条件逻辑,以确保这仅适用于此自定义“销售”页面。
add_action( 'woocommerce_product_query', 'so_28367762_product_query' );
function so_28367762_product_query( $q ){
$sale_page_id = 487;
if( isset( $q->queried_object_id ) && $q->queried_object_id === $sale_page_id ) {
$product_ids_on_sale = wc_get_product_ids_on_sale();
$q->set( 'post__in', (array) $product_ids_on_sale );
}
}
如果你有足够的促销产品,你应该有分页。今晚我没有得到的一件事是页面标题显示为“商店”,面包屑认为它是“商店”。我确信有一种解决方法......调整模板等等。
答案 1 :(得分:1)
add_action( 'pre_get_posts', 'so_28367762_pre_get_posts' );
function so_28367762_pre_get_posts( $q ) {
// We only want to affect the main query
if ( is_admin() || ! $q->is_main_query() ) {
return;
}
$sale_page_id = 487;
// totally modify the query on the Sale Page
if( isset( $q->queried_object_id ) && $q->queried_object_id === $sale_page_id ) {
$q->set( 'post_type', 'product' );
$q->set( 'page', '' );
$q->set( 'pagename', '' );
if ( isset( $q->query['paged'] ) ) {
$q->set( 'paged', $q->query['paged'] );
}
// Fix for verbose page rules
if ( $GLOBALS['wp_rewrite']->use_verbose_page_rules ) {
// Fix conditional Functions
$q->is_archive = true;
$q->is_post_type_archive = true;
$q->is_singular = false;
$q->is_page = false;
}
WC()->query->product_query( $q );
// We're on a shop page so queue the woocommerce_get_products_in_view function
add_action( 'wp', array( WC()->query, 'get_products_in_view' ), 2);
// And remove the pre_get_posts hook
WC()->query->remove_product_query();
}
}
很少修改并为我工作!
答案 2 :(得分:1)
尝试使用此简码[sale_products limit="10" columns="4" paginate="true"]
从woocommerce docs