使用wp_get_Object_Terms和WooCommerce_Term_Meta的分类自定义顺序

时间:2015-07-15 作者:Andy

我有一个与WooCommerce产品帖子类型关联的自定义分类法,我已将其添加到woocommerce_sortable_taxonomies 数组,以便可以在WordPress管理中对其进行排序。

插件将术语顺序存储在自己的数据库表中wp_woocommerce_termmeta 每行包含term_id, meta_key (订单价值)和meta_value

我使用wp_get_object_terms() 在网站的前端,仅通过指定了产品的术语。如何根据上述表格中存储的值对术语进行排序?

WooCommerce与terms_clauses 筛选以启用按此排序的术语,并调用get_terms() 但似乎无论如何都无法过滤wp_get_object_terms() 数据库查询。

2 个回复
最合适的回答,由SO网友:Andy 整理而成

我通过将术语数组传递给排序函数来解决这个问题。数组是通过引用传递的,因此无需返回任何内容:

function sort_object_terms(&$terms) {
    global $wpdb;

    // First get an array of just the term IDs
    $term_ids = array_map(function($term) {
        return (int)$term->term_id;
    }, $terms);

    // Now get the order value for all the term IDs
    $results = $wpdb->get_results(
        "
        SELECT woocommerce_term_id AS term_id, meta_value AS sort_order
        FROM {$wpdb->woocommerce_termmeta}
        WHERE meta_key = \'order\' AND woocommerce_term_id IN (\'" . implode("\',\'", $term_ids) . "\')
        "
    );

    $term_orders = array();
    foreach($results as $result) {
        $term_orders[ $result->term_id ] = $result->sort_order;
    }

    // Finally, sort the terms by their term order value
    uasort($terms, function($a, $b) use ($term_orders) {
        if($term_orders[ $a->term_id ] === $term_orders[ $b->term_id ]) {
            return 0;
        }

        return ( $term_orders[ $a->term_id ] > $term_orders[ $b->term_id ] ) ? 1 : -1;
    });
}

SO网友:alhoseany

您可以获取术语,然后创建一个术语ID数组,将其作为include参数传递,以获取带有菜单顺序参数的术语,woocommerce将如下处理其余的术语:

$terms = get_the_terms($post->ID, \'product_highlights\');
if (!empty($terms) && is_array($terms)) {
    $post_terms = array();
    foreach ($terms as $term) {
        $post_terms[] = $term->term_id;
    }

    $categories = get_terms(\'product_highlights\', array(
        \'orderby\' => \'name\',//required for woocommerce
        \'menu_order\' => \'asc\',//required for woocommerce
        \'include\' => $post_terms,
    ));
}

结束

相关推荐

Get_Terms();登录时显示私人帖子

嗨,有一个自定义的帖子类型“FAQ”。我有一些私人的“常见问题解答”,也只有登录用户才能看到。我为一个小部件使用了“get\\u terms()”功能,该小部件列出了指向这些“常见问题解答”类别的链接。“get\\u术语”没有列出只有私人“FAQ”的术语。$taxonomy = \'faq_kategorien\'; $tax_terms = get_terms($taxonomy); foreach ($tax_terms as $tax_term) { echo \'