web-dev-qa-db-ja.com

ループごとにスラッグでカテゴリを除外

Forループからいくつかのカテゴリを除外しようとしています。

<?php $categories = get_categories(array('exclude' => 'apps, windows')); ?>

<?php foreach ($categories as $category) : ?>
    // the_loop
<?php endforeach; ?>

エラーは発生しませんが、動作しません。すべてのカテゴリがループ内で使用されます。スラッグによっていくつかのカテゴリを除外するにはどうすればよいですか?

私は、異なる猫IDを持つが同じスラッグを持つ複数のサイトで作業しているので、猫IDではなくスラグでフィルタリングする必要があります。


将来の読者のために:Pieter Goosenがこの質問ともう1つをマージした回答に答えました here

2
Bram Vanroy

すでに述べたように、 codex から直接

除外

(文字列)wp_list_categoriesによって生成されたリストから1つ以上のカテゴリを除外します。このパラメータは、昇順で、一意のIDでカテゴリのカンマ区切りリストを取ります。

あなたが述べたように、あなたはカテゴリスラグを使わなければなりません。これを可能にし動的にするために、私はこれを達成するためにあなた自身のラッパー関数を書くことが最善であると思います。カテゴリを取得するために get_terms()get_categories() で内部的に使用される)を使用し、カテゴリIDを取得するために get_term_by() を使用してget_terms()に渡します

ここに関数があります、私はよりよく理解するためにそれをよくコメントしました(Require PHP 5.4+

function exclude_term_by( $taxonomy = 'category', $args = [], $exclude = [] )
{
    /*
     * If there are no term slugs to exclude or if $exclude is not a valid array, return get_terms
     */
    if ( empty( $exclude ) || !is_array( $exclude ) )
        return get_terms( $taxonomy, $args );

    /*
     * If we reach this point, then we have terms to exclude by slug
     * Simply continue the process. 
     */ 
    foreach ( $exclude as $value ) {

            /*
             * Use get_term_by to get the term ID and add ID's to an array
             */
            $term_objects = get_term_by( 'slug', $value, $taxonomy );
            $term_ids[] = (int) $term_objects->term_id;

    }

    /*
     * Set up the exclude parameter with an array of ids from $term_ids
     */
    $excluded_ids = [
        'exclude' => $term_ids
    ];

    /*
     * Merge the user passed arguments $args with the excluded terms $excluded_ids
     * If any value is passed to $args['exclude'], it will be ignored
     */
    $merged_arguments = array_merge( $args, $excluded_ids );

    /*
     * Lets pass everything to get_terms
     */
    $terms = get_terms( $taxonomy, $merged_arguments ); 

    /*
     * Return the results from get_terms
     */
    return $terms;
}

使用する前に、ここにいくつかの注意事項があります

  • 最初のパラメータ$taxonomyは、関数内でget_terms()に渡す特定の分類法です。デフォルトはcategoryです。

  • 2番目のパラメーター$argsは、get_terms()と同じパラメーターを取ります。ちなみに、3番目のパラメータが設定されている場合、デフォルトのexcludeパラメータの値が何も渡されても無視されます。この値は$excludeに渡されたものによって上書きされます。このパラメータに何も渡されず、$excludeに何も渡されない場合は、値として空の配列を渡す必要があります。

  • 3番目のパラメータ$excludesは、除外されるべき語句の配列を取ります。値が有効な配列でない場合、必要な項を除外せずにget_terms()が返されるので、必ずスラグの配列を渡してください。

  • 関数からの出力をget_terms()と同じ方法で扱います。関数からの値を使用する前に、空の値とWP_Errorオブジェクトもチェックする必要があります。

  • あなたが適当と思うようにコードを修正して悪用する

今度はあなたのテンプレートファイルの使用法のために。 $argsパラメータに何かが渡された場合、$excludeパラメータに渡された空の配列に注意してください。

$terms = exclude_term_by( 'category', [], ['term-slug-one', 'term-slug-two'] );
if ( !empty( $terms ) && !is_wp_error( $terms ) ) {
    ?><pre><?php var_dump($terms); ?></pre><?php
}   

使用法に関する追加情報については、get_terms()を参照してください。

2
Pieter Goosen

コードの最初の行に小さなエラーがあります。配列内の引用符で 'each'カテゴリを区切る必要があります。したがって、最初の行は次のようになります。

<?php $categories = get_categories(array('exclude' => 'apps', 'windows')); ?>
0
impsart