カテゴリの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で選択できますか?
事前にありがとうございます。
最初に Codex でthe_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)
を持つクラスをリンクタグに追加します。
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');
それが助けになることを願っています