jleuze
  • 0
Новичок

Добавить классы сообщений для пользовательских таксономий к пользовательскому типу сообщений?

  • 0

Я был удивлен, узнав, что пользовательские таксономии не добавляются в качестве основных или почтовых классов, как категории и теги.

Я уверен, что это будет добавлено в будущей версии WordPress, но пока мне нужно добавить пользовательскую таксономию к классу сообщений, чтобы я мог по-разному стилизовать сообщения в определенной категории в этой таксономии.

Было бы очень элегантно отфильтровать класс сообщений и добавить к нему таксономии. Я нашел фрагмент, чтобы осуществить аналогичный трюк с классом тела, но мне не удалось его адаптировать:

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.

Я пропустил что-то очевидное здесь, есть ли более простой способ решить эту проблему?

Share
  1. Я нашел фрагмент кода, любезно предоставленный 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;
    
            }
    
        }  ?>
    
    • 0
  2. Обновление: начиная с WordPress 4.2-alpha-31271 (23 января 2015 г.), классы CSS для пользовательских терминов таксономии теперь автоматически добавляются ядром WordPress при использовании файлов get_post_class() .

    Следующий фрагмент кода больше не нужен.


    Вот хорошая служебная функция, которая добавит все зарегистрированные общедоступные термины таксономии для post_class() использования в качестве зацепок CSS в темах:

    /**
    * 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;
        }
    }
    

    Вдохновение и признание предыдущего ответа Яна Фабри.

    Поместите приведенный выше код в 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">
    

    Он удобно работает с пользовательскими типами записей и таксономиями.

    • 0
  3. У меня есть улучшение ответа @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;
    }
    
    • 0
  4. Вместо the_terms вы можете использовать get_the_terms , что вернет объекты терминов таксономии. В Кодексе есть документация для версии только с тегами, 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' );
    
    • 0
  5. Я сделал немного кода и добавил поддержку класса сообщений в свой плагин под названием: Пользовательские типы сообщений и менеджер таксономий.

    В новой форме таксономии есть опция под названием Post class. Что позволяет добавить категорию|tag-{slug} и {slug}-{tax_value_slug} в класс записи.

    Скачать здесь https://github.com/Pravdomil/wp-custom-post-types-man/archive/master.zip

    • 0

Оставить ответ

You must login to add an answer.