以下是使用儿童类别作为后备的WooCommerce相关产品,并使用Rank Math主要类别排序的代码示例:
// 添加自定义的排序选项到产品排序下拉菜单
add_filter('woocommerce_get_catalog_ordering_args', 'child_category_fallback_sorting');
function child_category_fallback_sorting($args) {
$orderby_value = isset($_GET['orderby']) ? wc_clean($_GET['orderby']) : apply_filters('woocommerce_default_catalog_orderby', get_option('woocommerce_default_catalog_orderby'));
if ('child_category' == $orderby_value) {
$args['orderby'] = 'menu_order title';
$args['order'] = 'ASC';
$args['meta_query'] = array(
'relation' => 'OR',
array(
'key' => '_rank_math_primary_category',
'compare' => 'NOT EXISTS',
),
array(
'key' => '_rank_math_primary_category',
'value' => '',
'compare' => '=',
),
);
}
return $args;
}
// 修改产品排序下拉菜单显示的文本
add_filter('woocommerce_catalog_orderby', 'child_category_fallback_sorting_options');
function child_category_fallback_sorting_options($options) {
$options['child_category'] = '使用儿童类别作为后备';
return $options;
}
// 排除儿童类别的产品排序
add_filter('posts_clauses', 'child_category_fallback_sorting_exclude_child_category');
function child_category_fallback_sorting_exclude_child_category($clauses) {
global $wpdb;
$orderby_value = isset($_GET['orderby']) ? wc_clean($_GET['orderby']) : apply_filters('woocommerce_default_catalog_orderby', get_option('woocommerce_default_catalog_orderby'));
if ('child_category' == $orderby_value) {
$clauses['join'] .= "
LEFT JOIN {$wpdb->term_relationships} AS tr ON {$wpdb->posts}.ID = tr.object_id
LEFT JOIN {$wpdb->term_taxonomy} AS tt ON (tr.term_taxonomy_id = tt.term_taxonomy_id AND tt.taxonomy = 'product_cat')
LEFT JOIN {$wpdb->terms} AS t ON (tt.term_id = t.term_id AND t.term_id NOT IN (
SELECT parent
FROM {$wpdb->term_taxonomy}
WHERE taxonomy = 'product_cat' AND parent != 0
))
";
$clauses['where'] .= " AND (t.term_id IS NULL OR t.term_id = 0)";
}
return $clauses;
}
请确保将上述代码放置在您的活动主题(或自定义插件)的functions.php
文件中。这将添加一个名为“使用儿童类别作为后备”的排序选项到产品排序下拉菜单,并按照Rank Math主要类别排序产品。如果产品没有设置主要类别或主要类别不是儿童类别,它们将被作为后备排序。