web-dev-qa-db-ja.com

Get_categories結果を注文する方法

私はコーデックスのドキュメントを読みましたが、私はちょうど親、子のようにget_categories()の結果を注文することはできません。

私はこれらの種類のカテゴリーを3つ持っています:

-Events
    - Music
    - Culture
    - Workshop
    - Tourism
-Sport
    -Football
    -Rugby
    -Tennis

出力を次のようにします。

Events, Music

私は試した:

echo $product->get_categories();

そして結果はMusic、Events(child、parent)のプリントです。

また、引数get_categories()として$ argsを使用してみました。

$args = array(
'type'                     => 'post',
'child_of'                 => 0,
'parent'                   => '',
'orderby'                  => 'name',
'order'                    => 'ASC',
'hide_empty'               => 1,
'hierarchical'             => 1,
'exclude'                  => '',
'include'                  => '',
'number'                   => '',
'taxonomy'                 => 'category',
'pad_counts'               => false
); 

希望どおりに注文するにはどうすればよいですか。

1
Daniele Meli

まず $product->get_categories() はwoocommerce関数であるため機能しません。基本的には get_the_term_list のラッパーで、ソートパラメータはありません。 あなたが扱っているものを知るためにソースを見るのは常に良いことです

2番目に get_the_term_listget_the_terms を使用しますが、ソートパラメータもありません。後者はキャッシュ get_object_term_cache または直接 wp_get_object_terms のどちらかから項を取得します。ほとんどの場合、キャッシュは役に立ちません。そこにある用語が間違ったソートで保存されているため、問題になっているからです。一方、 wp_get_object_terms には - 最後に - ソートを定義する機能があります。

コーデックスより

使用方法

wp_get_object_terms( $object_ids, $taxonomies, $args )

デフォルト引数

$args = array('orderby' => 'name', 'order' => 'ASC', 'fields' => 'all');

最初の引数は 'orderby'と呼ばれ、既定値は 'name'です。サポートされているその他の値には、 'count'、 'slug'、 'term_group'、 'term_order'、および 'term_id'があります。

2番目の引数は 'order'と呼ばれ、デフォルト値は 'ASC'です。許容される唯一の他の値は 'DESC'です。

だからこれはあなたが望むものにあなたを近づけることができますが、自分で見てみましょう。

三番目に get_ancestors を使うことができます。

階層の最下位から最上位までの先祖の配列

階層型であるため、どちらがウーコマース商品カテゴリ分類にうまく機能します。ただし、階層レベルごとに複数の用語を割り当てる場合は、少し問題があります。私はこの一般的なトピックに関して answer を書きました。

3
Nicolai

私はget_categoriesの後に実行するこのコードを書きました。これは親のカテゴリと名前で結果を並べ替えます。

$all_categories = get_categories( $args );

$byId = array();
// Create an array with categories by id
foreach ($all_categories as $cat) {
    $byId[$cat->term_id] = $cat;
} 

// Add a new path field that we can sort by
foreach ($all_categories as $cat) { 
    $path = $cat->name;
    $parentCat = $cat;
    for($n=0;$n<10 && $parentCat->parent > 0;$n++) {
        // Limit to 10 levels (change if you need to)
        $parentCat = $byId[$parentCat->parent];
        $path = $parentCat->name."/".$path;
    }
    $cat->path = $path;
} 

// Finally sort by the new path field
function cmp($a, $b) {
    return strcmp($a->path,$b->path);
}

usort($all_categories, "cmp");

// $all_categories are now sorted by hierarchy and name
2

私はあなたのような設定をしていないので、何かを試してみましょう。私はコードを提供しています、あなたはもっと良い方法を試して私にフィードバックをください。それは満足ですか?

<?php
$args = array(
    'type'                     => 'post',
    'child_of'                 => 0,
    'parent'                   => '',
    'orderby'                  => 'name',
    'order'                    => 'ASC',
    'hide_empty'               => false,
    'hierarchical'             => 1,
    'exclude'                  => '',
    'include'                  => '',
    'number'                   => '',
    'taxonomy'                 => 'category',
    'pad_counts'               => false
);

$cats = get_categories( $args );
//var_dump($cat);
foreach( $cats as $cat ){
    echo $cat->name .', ';
}
?>
0
Mayeenul Islam

私は試した:

<?php
$args = array(
    'type'                     => 'product',
    'child_of'                 => 0,
    'parent'                   => '',
    'orderby'                  => 'term_group',
    'hide_empty'               => false,
    'hierarchical'             => 1,
    'exclude'                  => '',
    'include'                  => '',
    'number'                   => '',
    'taxonomy'                 => 'product_cat',
    'pad_counts'               => false
);

$cats = get_categories( $args );
//var_dump($cat);
foreach( $cats as $cat ){
    echo $cat->name.', ';
}
?>

私の場合は、階層ごとにグループ化されたすべてのカテゴリが表示されます。

Events, Sport, Music, Culture, Workshop, Tourism, Football, Rugby, Tennis.

投稿に選択されていないカテゴリは省略します。

0
Daniele Meli