WooCommerce-更改追加销售产品的订单

时间:2017-05-17 作者:Liam Winterton

与客户端站点有一些问题。

我们有一个产品与四个追加销售的产品相关联,并在网站上显示。唯一的问题是,这些产品在页面上的排列顺序似乎是随机的(即ID、发布日期、名称等之间没有相关性)。

我们想要的是显示那些产品,就像在后端输入的一样。

这是我们目前正在进行的代码设置(据我所知,这是vanilla WC,我将指出一个补充。

<?php
/**
 * Single Product Up-Sells
 *
 * @author      WooThemes
 * @package     WooCommerce/Templates
 * @version     1.6.4
 */

if ( ! defined( \'ABSPATH\' ) ) exit; // Exit if accessed directly

global $product, $woocommerce_loop;

$upsells = $product->get_upsells();

if ( sizeof( $upsells ) == 0 ) return;

$meta_query = WC()->query->get_meta_query();

$args = array(
    \'post_type\'           => \'product\',
    \'ignore_sticky_posts\' => 1,
    \'no_found_rows\'       => 1,
    \'posts_per_page\'      => $posts_per_page,
    \'orderby\'             => \'post__in\',
    \'order\'               => \'asc\',
    \'post__in\'            => $upsells,
    \'post__not_in\'        => array( $product->id ),
    \'meta_query\'          => $meta_query
);

$products = new WP_Query( $args );

$woocommerce_loop[\'columns\'] = $columns;

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

<div class="panel panel-default">
    <div class="panel-heading">
        <h2 class="panel-title"><?php _e( \'You may also like&hellip;\', 
\'woocommerce\' ) ?></h2>
    </div>
    <div class="panel-body">

        <?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(); ?>

    </div>
</div>

<?php endif;

wp_reset_postdata();
从该查询运行的查询似乎是错误的。(我对SQL的方式和WP数据库的结构都不是很精通)

这些参数当前生成此SQL查询

$args = array(
\'post_type\'           => \'product\',
\'ignore_sticky_posts\' => 1,
\'no_found_rows\'       => 1,
\'posts_per_page\'      => $posts_per_page,
\'orderby\'             => \'post__in\',
\'order\'               => \'asc\',
\'post__in\'            => $upsells,
\'post__not_in\'        => array( $product->id ),
\'meta_query\'          => $meta_query
);

SELECT wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) WHERE 1=1 AND wp_posts.ID IN (8487,8522,8478,11028) AND ( ( wp_postmeta.meta_key = \'_visibility\' AND wp_postmeta.meta_value IN (\'visible\',\'catalog\') ) ) AND wp_posts.post_type = \'product\' AND (wp_posts.post_status = \'publish\') GROUP BY wp_posts.ID ORDER BY wp_posts.menu_order, FIELD( wp_posts.ID, 8487,8522,8478,11028 ) LIMIT 0, 100

已尝试更改\'orderby\' 对双方\'post__in\'\'menu_order\'\'order\' 对双方\'asc\', \'desc\', 并完全删除创建id数组并将新数组传递到\'post__in\'\'post__not_in\'

干杯

1 个回复
SO网友:Ben HartLenn

评论时间太长了,所以在我的超级简单测试中覆盖了销售。php在带有WP\\U查询的全新WC安装上,我可以更改orderby和order参数,并按照我的产品ID数组的顺序显示产品:

$meta_query = WC()->query->get_meta_query();

$my_upsells = [171, 170, 172];

$args = array(
    \'post_type\'           => \'product\',
    \'ignore_sticky_posts\' => 1,
    \'no_found_rows\'       => 1,
    \'posts_per_page\'      => $posts_per_page,
    \'orderby\'             => \'post__in\',
    \'order\'               => \'asc\',
    \'post__in\'            => $my_upsells,
    \'meta_query\'          => $meta_query
);

$products = new WP_Query( $args );

while( $products->have_posts() ) : $products->the_post();
    echo get_the_title() . "<br>";
endwhile;
需要注意的是,WordPress确实指出,不能在同一个查询中组合post\\u in和post\\u not\\u in,如果$upsells数组已经具有所需的ID,那么无论如何都不需要它。

您是否介意共享您正在使用的整个模板文件,或者至少更多关于如何输出此查询结果的信息?听起来您正在处理的查询根本没有影响您的输出,因此我认为您在那里存在某种脱节。

编辑:看来您使用的是非常旧版本的woocommerce@v1。6.4这意味着您的Woocommerce自2012年以来从未更新过!您所说添加的函数get\\u upsells()实际上是一个woocommerce函数,它在woocommerce 3中被弃用,我正在测试它。我强烈建议您在继续尝试修复任何问题之前进行一些更新。

我无法继续帮助您,除非我们知道您的问题不是由您过时的Woocommerce版本,也可能是过时的WordPress版本引起的。

结束

相关推荐

Mysql SELECT posts

如何通过MYSQL从语言为“en”和“ru”的帖子中获取帖子我有这个问题$sql = \"SELECT p1.*, wm2.meta_value FROM wp_posts p1 LEFT JOIN wp_postmeta wm1 ON ( wm1.post_id = p1.ID AND wm1.meta_value IS NOT NULL AND wm1.meta_key = \'_thumbnail_id\' ) LEFT JOIN