在 WP_Query 中按 menu_order 对特定 Woocommerce 产品变体进行排序
Sort specific Woocommerce product variations by menu_order in a WP_Query
我有一个 WP_Query
来拉取并显示按全局属性过滤的 WooCommerce 产品变体列表。这可行,但我想按“menu_order”自定义排序结果。
但这不适用于 'post_type' => 'product_variation'
。可能是因为“menu_order”是在产品级别设置的。
('post_type' => 'product'
确实有效,但我需要变体)
$wc_query_params = array(
'post_type' => 'product_variation',
'posts_per_page' => -1,
'numberposts' => -1,
'post_status' => 'publish',
'meta_query' => array(array(
//filter variations on attribute name
'key' => 'attribute_pa_color',
'value' => 'blue',
)),
'order' => 'ASC',
'orderby' => 'menu_order',
);
$wc_query = new WP_Query($wc_query_params);
if ($wc_query->have_posts()) :
while ($wc_query->have_posts()) :
$wc_query->the_post();
//results
endwhile;
wp_reset_postdata();
endif;
有没有一种方法可以根据父产品“menu_order”对产品变体进行排序?
还是有另一种方法来自定义排序产品变体?
使用。我设法在与其父变量产品相同的 menu_order
中显示产品变体。
注意:此代码还按产品类别(我需要)过滤结果。
在下面的函数中,我添加了 ORDER by p.menu_order
以按 menu_order
对变体父 ID 进行排序。
function get_variation_parent_ids_from_term( $term, $taxonomy, $type ){
global $wpdb;
return $wpdb->get_col( "
SELECT DISTINCT p.ID
FROM {$wpdb->prefix}posts as p
INNER JOIN {$wpdb->prefix}posts as p2 ON p2.post_parent = p.ID
INNER JOIN {$wpdb->prefix}term_relationships as tr ON p.ID = tr.object_id
INNER JOIN {$wpdb->prefix}term_taxonomy as tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN {$wpdb->prefix}terms as t ON tt.term_id = t.term_id
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
AND p2.post_status = 'publish'
AND tt.taxonomy = '$taxonomy'
AND t.$type = '$term'
ORDER by p.menu_order
" );
}
并且我使用此排序顺序按父产品对 product_variations 进行排序。使用 'orderby' => 'post_parent__in'
来使用 post_parent__in
中给出的相同顺序。
$cat_name = 't-shirt'; // Product category name
$wc_query = new WP_Query( array(
'post_type' => 'product_variation',
'posts_per_page' => -1,
'numberposts' => -1,
'post_status' => 'publish',
'meta_query' => array( array(
'key' => 'attribute_pa_color',
'value' => 'blue',
) ),
'post_parent__in' => get_variation_parent_ids_from_term( $cat_name, 'product_cat', 'name' ),
'orderby' => 'post_parent__in', //orderby = same order as their parent products
) );
可能对其他人有用。
我有一个 WP_Query
来拉取并显示按全局属性过滤的 WooCommerce 产品变体列表。这可行,但我想按“menu_order”自定义排序结果。
但这不适用于 'post_type' => 'product_variation'
。可能是因为“menu_order”是在产品级别设置的。
('post_type' => 'product'
确实有效,但我需要变体)
$wc_query_params = array(
'post_type' => 'product_variation',
'posts_per_page' => -1,
'numberposts' => -1,
'post_status' => 'publish',
'meta_query' => array(array(
//filter variations on attribute name
'key' => 'attribute_pa_color',
'value' => 'blue',
)),
'order' => 'ASC',
'orderby' => 'menu_order',
);
$wc_query = new WP_Query($wc_query_params);
if ($wc_query->have_posts()) :
while ($wc_query->have_posts()) :
$wc_query->the_post();
//results
endwhile;
wp_reset_postdata();
endif;
有没有一种方法可以根据父产品“menu_order”对产品变体进行排序? 还是有另一种方法来自定义排序产品变体?
使用menu_order
中显示产品变体。
注意:此代码还按产品类别(我需要)过滤结果。
在下面的函数中,我添加了 ORDER by p.menu_order
以按 menu_order
对变体父 ID 进行排序。
function get_variation_parent_ids_from_term( $term, $taxonomy, $type ){
global $wpdb;
return $wpdb->get_col( "
SELECT DISTINCT p.ID
FROM {$wpdb->prefix}posts as p
INNER JOIN {$wpdb->prefix}posts as p2 ON p2.post_parent = p.ID
INNER JOIN {$wpdb->prefix}term_relationships as tr ON p.ID = tr.object_id
INNER JOIN {$wpdb->prefix}term_taxonomy as tt ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN {$wpdb->prefix}terms as t ON tt.term_id = t.term_id
WHERE p.post_type = 'product'
AND p.post_status = 'publish'
AND p2.post_status = 'publish'
AND tt.taxonomy = '$taxonomy'
AND t.$type = '$term'
ORDER by p.menu_order
" );
}
并且我使用此排序顺序按父产品对 product_variations 进行排序。使用 'orderby' => 'post_parent__in'
来使用 post_parent__in
中给出的相同顺序。
$cat_name = 't-shirt'; // Product category name
$wc_query = new WP_Query( array(
'post_type' => 'product_variation',
'posts_per_page' => -1,
'numberposts' => -1,
'post_status' => 'publish',
'meta_query' => array( array(
'key' => 'attribute_pa_color',
'value' => 'blue',
) ),
'post_parent__in' => get_variation_parent_ids_from_term( $cat_name, 'product_cat', 'name' ),
'orderby' => 'post_parent__in', //orderby = same order as their parent products
) );
可能对其他人有用。