Ajouter des classes post taxonomies personnalisées au type de poste personnalisé?

wordpress.stackexchange https://wordpress.stackexchange.com/questions/2266

  •  16-10-2019
  •  | 
  •  

Question

J'ai été surpris d'apprendre que taxonomies personnalisées ne sont pas ajoutés sous forme de classes de corps ou post comme les catégories et les étiquettes sont.

Je suis sûr que ce sera ajouté dans une version future de WordPress, mais en attendant, je dois ajouter une taxonomie personnalisée à la classe de poste afin que je puisse le style poste dans une certaine catégorie dans cette taxonomie différemment.

Ce serait la plus élégante pour filtrer la classe post et ajouter les taxonomies à lui. J'ai trouvé un extrait pour retirer un truc similaire avec la classe du corps, mais je n'ai pas réussi à l'adapter:

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' );

Un peu plus crûment, je pensais à l'aide the_terms fonction pour créer mes propres classes pour les postes personnalisés, quelque chose comme ceci:

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

Mais alors je dois filtrer le code HTML qui génère the_term.

Am tout ce que je manque évident ici, est-il un moyen plus simple de résoudre ce problème?

Était-ce utile?

La solution

J'ai trouvé un extrait de code de mfields qui a résolu ce problème pour moi, voici ce que je fini par utiliser:

<?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;

        }

    }  ?>

Autres conseils

Mise à jour: Comme de WordPress 4.2-alpha-31271 (23 Janvier 2015), les classes CSS pour les termes de taxonomie personnalisés sont maintenant ajoutés automatiquement par le noyau WordPress lors de l'utilisation get_post_class().

Le code suivant n'est plus nécessaire.


Voici une bonne fonction utilitaire qui Ajouter tous les termes inscrits, taxonomie publique post_class() pour que des crochets CSS dans les thèmes:

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

Inspiration et crédit de réponse précédente Jan Fabry.

Placez le code ci-dessus dans le fichier functions.php de votre thème. Ensuite, chaque fois que le post_class() est utilisé dans un modèle:

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

Il sortira un terme de taxonomie publique personnalisée (s) attaché au poste, en plus de toutes les classes de poste par défaut. Par exemple:

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

Il fonctionne avec haut la main Types personnalisés poste et taxonomies.

Au lieu de the_terms , vous pouvez utiliser get_the_terms , qui retournera le terme de taxonomie objets . Le Codex a la documentation pour la version tag seule, get_the_tags .

Cela vous donne quelque chose comme ceci:

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' );

J'ai une amélioration @ réponse de RJB (je n'ai pas assez réputation commentaire, désolé). Je recevais une erreur « tableau à la conversion de chaînes » avec le mode de débogage activé, alors je l'ai fait une boucle foreach des taxonomies retournés et maintenant il n'y a pas d'erreur.

Espérons que cela aide quelqu'un!

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

J'ai fait quelques codage et ajouter le support de la classe après, à mon plugin appelé: types de poste personnalisé et gestionnaire taxonomies

Dans la nouvelle forme de taxonomie est option appelée classe Post. Ce qui permet d'ajouter catégorie |. {Limaces} TAG- et {slug} - {} tax_value_slug à la classe post

Télécharger ici https://github.com/Pravdomil/wp-custom -POST-types-man / archive / master.zip

Licencié sous: CC-BY-SA avec attribution
Non affilié à wordpress.stackexchange
scroll top