web-dev-qa-db-ja.com

get_terms name__like文字順でカテゴリをリストする

私のカテゴリは基本的に作家です、そして私は彼らの姓に従ってそれらをリストする関数を作りたいです。例えば、私は以下のようなものが欲しいのですが。

E:

  • ハインツ・アーハルト
  • アルバート・アインシュタイン
  • エミネム

問題は、私はEという文字でソートしたいと思う名前が1つだけ( "Eminem"のような)の著者もいることです。ワードプレスでこれを行うには、get_terms関数とname__like

function getAuthors(){
$args = array(
    'name__like' => 'E',
);
return get_terms('category', $args );
}

これにより、 "E"が含まれているカテゴリのみをリストするSQLクエリが作成されます。

AND t.name LIKE %E%;

しかし、私は何かが必要です:

AND t.name NOT LIKE '% %' AND t.name LIKE E% OR t.name LIKE '% E';

クエリが設定されているコアファイル内のget_terms関数のコードを変更しようとしました(taxonomies.php、行1809)。しかし私は成功しなかったし、私はコアファイルの何かを変更したくない。

name__likeによって渡されるクエリをどのようにカスタマイズできますか?目標を達成するための他のより良い方法はありますか?

---編集---

私はTheDeadMedicの解決策を使い、例えばget_terms( 'my_taxonomy', 'surname=E' );を使うことによって特定の文字に従ってカテゴリをリストすることができました。しかし、私が1ページでget_terms関数を複数回使いたい場合、このsurname引数は機能しません。 loop - AZの見出しを作成し、見出しの下にソートされたカテゴリを表示したい場合).

これが私が実行しようとしている関数です。問題は、すべての見出しの下にsurname=Aのカテゴリが一覧表示され続けることです。

function getAuthors()
{
$letters = range('A', 'Z'); // create Alphabet array
foreach ($letters as $letter) {
    echo '<h4>' . $letter . '</h4>';
    $args = array(
        'surname' => $letter
    );
    $cats = get_terms('category', $args);

    foreach ($cats as $cat) {
        echo "<ul>";
        echo "<li>" . $cat->name . "</li>";
        echo "</ul>";
    }
  }
}

ただし、name__like引数はループ内で機能するようです。

3
ndru

terms_clausesフィルタを使用して、クエリのさまざまなコンポーネント(fields、join、where、orderby、order&limits)をすべて渡し、独自の "search"引数を実装します。

function wpse_178511_get_terms_fields( $clauses, $taxonomies, $args ) {
    if ( ! empty( $args['surname'] ) ) {
        global $wpdb;

        $surname_like = $wpdb->esc_like( $args['surname'] );

        if ( ! isset( $clauses['where'] ) )
            $clauses['where'] = '1=1';

        $clauses['where'] .= $wpdb->prepare( " AND t.name LIKE %s OR t.name LIKE %s", "$surname_like%", "% $surname_like%" );
    }

    return $clauses;
}

add_filter( 'terms_clauses', 'wpse_178511_get_terms_fields', 10, 3 );

使用する

 get_terms( 'my_taxonomy', 'surname=E' );
5
TheDeadMedic