【问题标题】:Woocommerce: how to display only scheduled sale productsWoocommerce:如何仅显示预定销售产品
【发布时间】:2014-07-04 11:32:08
【问题描述】:

亲爱的 StackOverflow 朋友们, 我使用这个 Woocommerce 短代码

[sale_products per_page="12"]

在页面上仅显示在售的产品。此短代码完美运行,仅过滤特价商品,包括简单商品和可变商品。

现在我想获得相同的结果,但我只需要显示预定销售的产品,换句话说,只显示预定销售价格的产品

Wordpress > 产品 > 一般 > 销售价格 > 时间表

我试图找出“正常销售产品”和“预定销售产品”之间的输出差异,但不幸的是我什么也没注意到。

感谢您的帮助!

==================================

好的,这里是完整的工作代码,以供将来参考。感谢@Palmered 解决了我的问题!

我在我的functions.php中添加了这段代码

/* This creates a Woocommerce shortcode for displaying only scheduled on sale products, both simple and variable ones */

function scheduled_sale_products( $atts ) {
        global $woocommerce_loop,$wpdb;

        extract( shortcode_atts( array(
            'per_page'      => '12',
            'columns'       => '4',
            'orderby'       => 'title',
            'order'         => 'asc'
        ), $atts ) );

        // Get products on sale
        $product_ids_raw = $wpdb->get_results(
"SELECT posts.ID, posts.post_parent
FROM `$wpdb->posts` posts
INNER JOIN `$wpdb->postmeta` ON (posts.ID = wp_postmeta.post_id)
INNER JOIN `$wpdb->postmeta` AS mt1 ON (posts.ID = mt1.post_id)
WHERE
    posts.post_status = 'publish'
    AND  (mt1.meta_key = '_sale_price_dates_to' AND mt1.meta_value >= ".time().") 
    GROUP BY posts.ID 
    ORDER BY posts.post_title ASC LIMIT 0,12");

$product_ids_on_sale = array();

foreach ( $product_ids_raw as $product_raw ) 
{
    if(!empty($product_raw->post_parent))
    {
        $product_ids_on_sale[] = $product_raw->post_parent;
    }
    else
    {
        $product_ids_on_sale[] = $product_raw->ID;  
    }
}
$product_ids_on_sale = array_unique($product_ids_on_sale);

        $meta_query   = array();
        $meta_query[] = WC()->query->visibility_meta_query();
        $meta_query[] = WC()->query->stock_status_meta_query();
        $meta_query   = array_filter( $meta_query );

        $args = array(
            'posts_per_page'    => $per_page,
            'orderby'           => $orderby,
            'order'             => $order,
            'no_found_rows'     => 1,
            'post_status'       => 'publish',
            'post_type'         => 'product',
            'meta_query'        => $meta_query,
            'post__in'          => array_merge( array( 0 ), $product_ids_on_sale )
        );

        ob_start();

        $products = new WP_Query( apply_filters( 'woocommerce_shortcode_products_query', $args, $atts ) );

        $woocommerce_loop['columns'] = $columns;

        if ( $products->have_posts() ) : ?>

            <?php woocommerce_product_loop_start(); ?>

                <?php while ( $products->have_posts() ) : $products->the_post(); ?>

                    <?php wc_get_template_part( 'content', 'product' ); ?>

                <?php endwhile; // end of the loop. ?>

            <?php woocommerce_product_loop_end(); ?>

        <?php endif;

        wp_reset_postdata();

        return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean() . '</div>';
    }
add_shortcode( 'scheduled_sale_products', 'scheduled_sale_products' );

现在新的 Woocommerce 短代码可以使用了

[scheduled_sale_products per_page="12"]

【问题讨论】:

    标签: woocommerce


    【解决方案1】:

    我的建议是:

    将 sale_products 短代码复制到您的主题(functions.php)或自定义插件(插件文件夹内的 php 文件)中。从 /wp-content/plugins/woocommerce/includes/class-wc-shortcodes.php 复制名为 sale_products 的完整函数。它从第 560 行开始。

    第 1 步:复制

    之间的所有内容
    public static function sale_products( $atts ) {
        global $woocommerce_loop;
    

        return '<div class="woocommerce columns-' . $columns . '">' . ob_get_clean() . '</div>';
    }
    

    进入您的主题或插件。

    第 2 步:从

    更改函数声明
    public static function sale_products( $atts ) {
    

    function scheduled_sale_products( $atts ) {
    

    第 3 步:将短代码挂钩到 wordpress。

    add_shortcode( 'scheduled_sale_products', 'scheduled_sale_products' );
    

    第 4 步:更改查询。

    替换这一行:

    $product_ids_on_sale = wc_get_product_ids_on_sale();
    

    与:

    $product_ids_raw = $wpdb->get_results(
    "SELECT posts.ID, posts.post_parent
    FROM `$wpdb->posts` posts
    INNER JOIN `$wpdb->postmeta` ON (posts.ID = wp_postmeta.post_id)
    INNER JOIN `$wpdb->postmeta` AS mt1 ON (posts.ID = mt1.post_id)
    WHERE
        posts.post_status = 'publish'
        AND  (mt1.meta_key = '_sale_price_dates_to' AND mt1.meta_value >= ".time().") 
        GROUP BY posts.ID 
        ORDER BY posts.post_title ASC LIMIT 0,12");
    
    $product_ids_on_sale = array();
    
    foreach ( $product_ids_raw as $product_raw ) 
    {
        if(!empty($product_raw->post_parent))
        {
            $product_ids_on_sale[] = $product_raw->post_parent;
        }
        else
        {
            $product_ids_on_sale[] = $product_raw->ID;  
        }
    }
    $product_ids_on_sale = array_unique($product_ids_on_sale);
    

    现在您应该可以像这样使用短代码了:

    [scheduled_sale_products per_page="12"]
    

    【讨论】:

    • 多么详细的答案!谢谢@Pekz0r!我试图将您的建议应用于我的代码,但我看不到任何产品。我编辑了我的问题,添加了我的步骤,试图正确应用你的想法。再次感谢您为我花费的时间:)
    • 很抱歉,我在第 2 步和第 3 步中犯了一个错误。我已经编辑了帖子,所以请重新访问第 2 步和第 3 步,以确保它与上面一样。如果它不起作用,请再次与我联系。
    • 嗨@Pelmered 再次感谢!我按照您的新指南编辑了代码。现在我可以看到四种产品,但其中只有一种是预定销售产品。显示的其他产品是一些正在销售的项目。我不知道为什么这些出现在这里而其他没有(还有其他销售产品和其他预定销售产品没有显示在这个简码中)。我正在尝试查找显示的项目之间的关联!
    • 好的,那么我们可能就快到了。该 meta_query 似乎有些东西,但我不确定如何编写它。我需要自己测试这段代码。
    • 伟大的@Pelmered,谢谢!我也在找解决方法!我试图明确一个日期,使用 current_time,将 并将 '_sale_price_dates_to' 更改为 '_sale_price_dates_from'。还试图找到一种“sale_price_end_date”或类似的东西,但到目前为止还没有结果! :)
    猜你喜欢
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2018-04-08
    • 2016-05-17
    • 1970-01-01
    相关资源
    最近更新 更多