web-dev-qa-db-ja.com

カスタム分類タイプの投稿クラスをカスタム投稿タイプに追加しますか?

カスタム分類法が、カテゴリやタグのようなボディまたはポストクラスとして追加されていないことを知って驚きました。

これは将来のバージョンのWordPressで追加されると確信していますが、その間、私はその分類法の特定のカテゴリーで異なるスタイルで投稿をスタイルできるように、カスタム分類法をpostクラスに追加する必要があります。

投稿クラスをフィルタリングして分類を追加するのが最もエレガントです。 私はスニペットを見つけました ボディクラスで同様のトリックをやってのけるために/私はそれを適応させることに成功していません:

function wpprogrammer_post_name_in_body_class( $classes ){
 if( is_singular() )
 {
  global $post;
  array_Push( $classes, "{$post->post_type}-{$post->post_name}" );
 }
 return $classes;
}

add_filter( 'body_class', 'wpprogrammer_post_name_in_body_class' );

もう少し大雑把に言うと、カスタム投稿用の独自のクラスを作成するためにthe_terms関数を使用することを考えました。

<div class="<?php the_terms( $post->ID, 'taxonomy', '', ' ', '' ); ?>"></div>

しかし、それから私はthe_termが生成するHTMLを除外しなければなりません。

ここで明白なことが足りないのですが、この問題を解決するもっと簡単な方法はありますか?

4
JLeuze

mfields のおかげでこの問題を解決したコードの断片が見つかりました。使用した結果は次のとおりです。

<?php   // Add custom taxonomies to the post class

    add_filter( 'post_class', 'custom_taxonomy_post_class', 10, 3 );

    if( !function_exists( 'custom_taxonomy_post_class' ) ) {

        function custom_taxonomy_post_class( $classes, $class, $ID ) {

            $taxonomy = 'listing-category';

            $terms = get_the_terms( (int) $ID, $taxonomy );

            if( !empty( $terms ) ) {

                foreach( (array) $terms as $order => $term ) {

                    if( !in_array( $term->slug, $classes ) ) {

                        $classes[] = $term->slug;

                    }

                }

            }

            return $classes;

        }

    }  ?>
7
JLeuze

更新: WordPress 4.2-alpha-31271 (2015年1月23日)では、カスタム分類用語用のCSSクラスがget_post_class()を使用するときにWordPressコアによって自動的に追加されるようになりました。

次のコードスニペットは必要なくなりました。


テーマにCSSフックとして使用するために、すべての登録済み、公的分類法用語post_class() に追加する)/ = - を追加するのに便利な便利な関数です。

/**
* Add Custom Taxonomy Terms To The Post Class
*/

add_filter( 'post_class', 'wpse_2266_custom_taxonomy_post_class', 10, 3 );

if ( ! function_exists('wpse_2266_custom_taxonomy_post_class') ) {
    function wpse_2266_custom_taxonomy_post_class($classes, $class, $ID) {

        $taxonomies_args = array(
            'public' => true,
            '_builtin' => false,
        );

        $taxonomies = get_taxonomies( $taxonomies_args, 'names', 'and' );

        $terms = get_the_terms( (int) $ID, (array) $taxonomies );

        if ( ! empty( $terms ) ) {
            foreach ( (array) $terms as $order => $term ) {
                if ( ! in_array( $term->slug, $classes ) ) {
                    $classes[] = $term->slug;
                }
            }
        }

        $classes[] = 'clearfix';

        return $classes;
    }
}

Jan Fabryの前回の回答からのインスピレーションとクレジット。

あなたのテーマのfunctions.phpファイルに上記のコードを入れてください。それから、post_class()がテンプレートで使われる時はいつでも:

<article id="post-<?php the_ID(); ?>" <?php post_class(); ?>>

デフォルトの投稿クラスのすべてに加えて、投稿に添付されているパブリックカスタム分類用語が出力されます。例えば:

<article id="post-247" class="post-247 post-type ... status-publish hentry clearfix">

カスタム投稿タイプと分類法と便利に連携します。

3
rjb

@ rjbの回答が改善されました(コメントするのに十分な評判がありません、申し訳ありません)。デバッグモードをオンにした状態で「配列から文字列への変換」エラーが発生したため、返された分類法のforeachループを実行しましたが、現在はエラーはありません。

これが誰かに役立つことを願っています!

add_filter( 'post_class', 'custom_taxonomy_post_class', 10, 3 );

function custom_taxonomy_post_class($classes, $class, $ID) {

    $taxonomies_args = array(
        'public' => true,
        '_builtin' => false,
    );

    $taxonomies = get_taxonomies( $taxonomies_args, 'names', 'and' );

    foreach ($taxonomies as $taxonomy) {

    $terms = get_the_terms( (int) $ID, $taxonomy );

    if ( ! empty( $terms ) ) {
        foreach ( (array) $terms as $order => $term ) {
            if ( ! in_array( $term->slug, $classes ) ) {
                $classes[] = $term->slug;
            }
        }
    }


}

    $classes[] = 'clearfix';

    return $classes;
}
1
bhammie85

the_terms の代わりに、 get_the_terms を使用することもできます。これにより、分類用語 objects が返されます。 Codexにはタグのみのバージョン get_the_tags のドキュメントがあります。

それはあなたにこのような何かを与えるでしょう:

function wpprogrammer_custom_taxonomy_in_body_class( $classes ){
  if( is_singular() )
  {
    $custom_terms = get_the_terms(0, 'my_custom_taxonomy');
    if ($custom_terms) {
      foreach ($custom_terms as $custom_term) {
        $classes[] = 'custom_tag_' . $custom_term->slug;
      }
    }
  }
  return $classes;
}

add_filter( 'body_class', 'wpprogrammer_custom_taxonomy_in_body_class' );
1
Jan Fabry

私はいくつかのコーディングをし、私は私のプラグインにポストクラスのサポートを追加しました: カスタム投稿タイプと分類法マネージャ

新しい分類形式ではPostクラスというオプションです。これにより、 category | tag- {slug} および {slug} - {tax_value_slug} を投稿クラスに追加できます。

ここからダウンロードしてください https://github.com/Pravdomil/wp-custom-post-types-man/archive/master.Zip

0
pravdomil