web-dev-qa-db-ja.com

get_termsカスタムオーダー

カスタム分類のすべての用語をアルファベット順に並べるためにget_terms関数を使用しています。しかし、私のクライアントは今、用語の1つを最後に置くように要求しています(したがってアルファベット順ではありません)。誰もがこれを達成するための最良の方法について何か提案がありますか?

2
Duncan Morley

これはあなた自身のカスタム関数で簡単にできます。ここでやりたいことは、あなたのオブジェクトをあなたのtermオブジェクトを保持するget_terms()から取得し、あなたのユニークなキーがパラメータとして設定されているかどうかを確認し、それに従ってそれを削除

さて、それをコードに入れてみましょう:(私はに従うのを簡単にするためにコードにコメントしました)

これはPHP 5.5より前のバージョンですが、それでも少なくともPHP 5.4が必要です

function get_term_to_end( $taxonomy = '', $args = [] )
{
    $terms = get_terms( $taxonomy, $args );

    /*
     * Return $terms if our new argument term_to_end is not set or empty
     */
    if ( !isset( $args['term_to_end'] ) || empty( $args['term_to_end'] ) ) 
        return $terms;

    /*
     * If term_to_end is set and has a value, continue to process
     * Return $terms if a wp error is returned or if $terms is empty
     */
    if ( is_wp_error( $terms ) || empty( $terms ) )
        return $terms;
     /*
      * We have came this far, now we can finish this off
      */
    foreach ( $terms as $term ) {
        /*
         * Check the term ids against our new argument term_to_end
         */
        if ( $term->term_id == $args['term_to_end'] ) {
            $end[] = $term;
        } else {
            $terms_array[] = $term;
        }
    }
    /*
     * Merge the two arrays together, adding the term_to_end right at the back
     */
    $terms = array_merge( $terms_array, $end );

    /*
     * For uniformaty, type cast the resultant array to an object
     */
    return (object) $terms;
}

PHP 5.5以降を使用している場合は、array_searchおよびarray_columnを使用して、関数内でforeachループをスキップすることができます。

function get_term_to_end( $taxonomy = '', $args = [] )
{
    $terms = get_terms( $taxonomy, $args );

    /*
     * Return $terms if our new argument term_to_end is not set or empty
     */
    if ( !isset( $args['term_to_end'] ) || empty( $args['term_to_end'] ) ) 
        return $terms;

    /*
     * If term_to_end is set and has a value, continue to process
     * Return $terms if a wp error is returned or if $terms is empty
     */
    if ( is_wp_error( $terms ) || empty( $terms ) )
        return $terms;

     /*
      * We have came this far, now we can finish this off
      *
      * We need to convert the multidimensional objects to a multidimensional array. Lets used
      * json_encode and json_decode. Now we can use 
      * array_search to and array_column to determine the position of the term_to_end
      */
    $terms_array = json_decode( json_encode( $terms ), true );
    $end_term_position = array_search( $args['term_to_end'], array_column( $terms_array, 'term_id'));

    /*
     * First check if $end_term_position in not false (array_search returns false on failure), 
     * if false, return $terms
     */
    if ( !$end_term_position )
        return $terms;

    /*
     * Get the key value pair for term_to_end, unset it from $terms and reset term_to_end pair at the back
     */
    $end_term_pair[] = $terms[$end_term_position];
    unset( $terms[$end_term_position] );
    $new_terms_array = array_merge( (array) $terms, $end_term_pair );

    /*
     * We are done!! Now we can just return $new_terms_array as an object
     */
    return (object) $new_terms_array;
}

ユースケースの例:

分類法mytaxに属するid 15の用語を用語配列の末尾に移動します。デフォルトの名前順に並べます

$terms = get_term_to_end( 'mytax', ['term_to_end' => 15] );

または

$args = [
    'term_to_end' => 15
];
$terms = get_term_to_end( 'mytax, $args );

上のいくつかの注意

  • 上記のコードはすべてテストされていないため、バグがある可能性があります。私はこれをタブレットに書いた。

  • 古いバージョン(_ PHP 5.4より前)では、最初のコードブロックを使用し、新しい配列構文([])を古い構文(array())に変更するだけです。

  • 新しいパラメータterm_to_endは、用語を使用して最後の用語のIDに移動します。必要に応じて、これを修正して、用語名または用語スラッグのどちらでも機能させることができます。これらすべての値で機能するようにこれを変更することもできます。

  • 新しい関数はget_terms()とまったく同じパラメータを使用します。唯一の追加機能はterm_to_endパラメータです。

  • get_termsと同じように、新しい関数は、分類法が存在しない場合はWP_Errorオブジェクトを返し、用語が見つからない場合は空の配列も返します。 get_termsと同じ方法でこれらの発生をチェックすることを忘れないでください

  • term_to_endパラメータが設定されている場合、fieldsパラメータをall(デフォルト)以外に設定することはできません。それ以外の値を指定すると機能が停止します。いくつかの条件付きチェックを組み込んで最初のコードブロックでforeachを変更するか、2番目のコードブロックでarray_searchの使用を変更することで、これを非常に簡単に修正して正しく動作するようにできます

  • 必要に応じて、選択した用語を最前面に移動するように機能を非常に簡単に変更できます。移動する複数の用語を受け入れるように機能を調整することもできます

  • この関数の使用に関するその他の情報については、 get_terms を参照してください。

編集

このコードは現在テスト済みで、期待通りに動作しています。

3
Pieter Goosen

これを行うにはもっと良い方法があるかもしれませんが、たぶん2つのクエリを実行することができます。たぶんこれらの行に沿った何か(未テスト):

$loner_term = X; //put whatever the id of the term you want at end
$taxonomies = 'YOUR_TAXONOMY_NAME';
)
// get all of the alphabetical terms and exclude the one you need at the end
$alpha_args = array(
    'orderby' => 'name',
    'exclude' => $loner_term
);
$alpha_terms = get_terms($taxonomies, $alpha_args);

// only get the term you need to come at the end
$na_args = array(
    'include' => $loner_term
);
$na_terms = get_terms($taxonomies, $na_args);

echo '<ul>';
// loop through the alphabetical terms
foreach ($alpha_terms as $alpha_term) {
    echo '<li>'. $alpha_term->name.'</li>';
}
// then loop through the loner term
foreach ($na_terms as $na_term) {
    echo '<li>'. $na_term->name.'</li>';
}    
echo '</ul>';

Get_termsを正しく使用するように編集しました。

0
Stephen S.

私は最近似たような問題に出会いました。もしあなたがプラグインを使い慣れていれば、 Custom Taxonomy Sort をインストールすることができます。 2年以上更新されていなくても、問題は解決しました。基本的には、ダッシュボードから手動で用語を並べ替えることができます。

0
Dmitry Mayorov

私の考えでは、 'append'のような用語をあなたの分類法に追加し、それからあなたがあなたの用語の最後に追加したい用語をその用語の子供たちのリストにすることです。それは適切な用語の問い合わせをすることだけです。すなわち、appendを持つすべての用語を親として取得し、それから残りのクエリに対してそれらを除外します。このようにして、あなたはこのカスタム発注物に対する編集管理を維持し、あなたのテンプレートに何かをハードコードする必要はありません。

0