Woocommerce Shortcodes Pagination

时间:2015-02-06 14:17:51

标签: pagination woocommerce product

一直试图弄清楚如何创建一个循环来支持woocommerce的短代码与分页。

因为目前,我有一个项目,并希望有一个显示某个产品的页面,例如我有50个促销产品,使用这个短代码[sale_products per_page =" 10"]它只是显示10个产品没有分页。有关这个问题的任何想法?

此致

3 个答案:

答案 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__inproduct_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

了解更多信息