与客户端站点有一些问题。
我们有一个产品与四个追加销售的产品相关联,并在网站上显示。唯一的问题是,这些产品在页面上的排列顺序似乎是随机的(即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…\',
\'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\'
通过woocommerce标签,我知道这是离题的,但我希望核心问题是WP查询(我无法想象它是WC特定的)。如果没有,我非常乐意搬迁。
干杯
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版本引起的。