web-dev-qa-db-ja.com

Class_nameを_category()関数に追加しますか?

カテゴリのslugをクラス名としてthe_category()関数に追加するためにadd_filterまたは同様のものを使用することは可能ですか?

the_category()を使うとき、出力はこのようになります…

<ul class="post-categories">
    <li>
        <a href="http://mysite.com/something" title="" rel="category tag">News</a>
    </li>
</ul>

どういうわけかこれを得ることは可能ですか…

<ul class="post-categories">
    <li class="category-news">
        <a href="http://mysite.com/something" title="" rel="category tag">News</a>
    </li>
</ul>

それとも似たようなもので、少なくともカテゴリ名がslugのクラス名なのでCSSで選択できますか?

事前にありがとうございます。

1
mathiregister

最初に Codexthe_category()を見つけます。ページの一番下までスクロールして[Source Code]に移動します。 "the_categfory()は...にあります"というリンクがあります。リンクをクリックすると、 ソースコード にリダイレクトされます。 IDEまたはエディタでファイルwp-includes/category-template.phpを交互に開くこともできます。

function the_category()を検索してください。その関数が別の関数get_the_category_list()を呼び出すのがわかります。この機能も検索してください。そしてコードを読み、apply_filters()またはadd_action()を検索してください。

ご覧のとおり、関数の終わりにはapply_filters()呼び出しが1つだけあります。コードを注意深く読んでいれば、the_category()によって作成されたcomplete htmlのみをフィルタリングできることがわかりました。

HTMLを修正するにはいくつかの方法があります。 DOMDocumentはそのうちの1つです。古きpreg_replace_callback()のもう1つです。

function add_class_callback( $result ) {

  $class = strtolower( $result[2] );
  $class = str_replace( ' ', '-', $class );
  // do more sanitazion on the class (slug) like esc_attr() and so on

  $replacement = sprintf( ' class="%s">%s</a>', $class, $result[2] );
  return preg_replace( '#>([^<]+)</a>#Uis', $replacement, $result[0] );

}

function add_category_slug( $html ) {

  $search  = '#<a[^>]+(\>([^<]+)\</a>)#Uuis';
  $html = preg_replace_callback( $search, 'add_class_callback', $html );

  return $html;
}

add_filter( 'the_category', 'add_category_slug', 99, 1 );

簡単ですね。 the_categoryフックにフィルタを適用します。 <a followed by some chars but not >[group the chars until <]</a>を検索し、結果をコールバック関数に渡します。コールバック関数はすべての検索結果を含む配列を取得します。最後のものを選びます。これはリンクのテキストです。それからテキストからクラスを作成し、これを(あなた自身のもので)非常によくサニタイズしてください。大事なことを言い忘れましたが、class属性を挿入し、生成された結果をpreg_replace_callback()に返します。検索結果に置き換えられます。

はい、私はDOM操作がとても好きです。

ああ、忘れた。これはjQueryでもできます。クラス '.post-categories'を検索し、リストタグ内のすべてのリンクタグをgrepし、結果をたどってhref属性を取得し、それを適切なクラス名に変換し、.addClass(class)を持つクラスをリンクタグに追加します。

6
Ralf912

ClassNamesのサニタイズは一部の言語では非常に難しい場合がありますが、@ powerbuoyのコメントを好み、それを理解しました。

function yourTheme_category_class($thelist){
  $categories = get_the_category();

  if ( !$categories || is_wp_error($categories) ) {
    return $thelist;
  }

  $output = '<ul class="post-categories">';
  foreach ( $categories as $category ) {
    $output .= '<li class="category-' . $category->slug . '"><a href="' . esc_url(get_category_link($category->term_id)) . '">' . $category->name . '</a></li>';
  }
  $output .= '</ul>';

  return $output;
}
add_filter( 'the_category', 'yourTheme_category_class');

それが助けになることを願っています

2