it-swarm.dev

Přidat třídy příspěvků pro vlastní taxonomie do vlastního typu příspěvku?

Byl jsem překvapen, když jsem zjistil, že vlastní taxonomie nejsou přidávány jako třídy nebo postové třídy, jako jsou kategorie a značky.

Jsem si jistý, že to bude přidáno v budoucí verzi WordPressu, ale mezitím musím přidat vlastní taxonomii do třídy příspěvků, abych mohl styl v určité kategorii v této taxonomii odlišovat.

Bylo by nejelegantnější filtrovat třídu příspěvků a přidat do ní taxonomie. Našel jsem úryvek abych si vytáhl podobný trik s třídou těla, ale nepodařilo se mi ho přizpůsobit:

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

Trochu krutěji jsem přemýšlel o použití funkce the_terms pro vytvoření vlastních tříd pro vlastní příspěvky, něco takového:

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

Ale pak bych musel filtrovat HTML, které vygeneruje the_term.

Chybí mi něco zjevného, ​​existuje snadnější způsob, jak tento problém vyřešit?

4
JLeuze

Našel jsem úryvek kódu laskavost mfields který tento problém vyřešil pro mě, tady je to, co jsem skončil s použitím:

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

Update: Jak WordPress 4.2-alpha-31271 (23. ledna 2015), CSS třídy pro vlastní termíny taxonomie jsou nyní automaticky přidány WordPress jádrem při použití get_post_class().

Následující fragment kódu již není nutný.


Zde je dobrá užitná funkce, která bude add všechny registrované termíny veřejné taxonomie do post_class() pro použití jako háčky CSS v tématech:

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

Inspirace a uznání z předchozí odpovědi Jana Fabryho.

Vložte výše uvedený kód do souboru functions.php. Poté, kdy je v šabloně použito post_class():

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

Kromě všech výchozích tříd příspěvků bude na výstupu jakýkoli veřejný termín (názvy) vlastní taxonomie připojený k příspěvku. Například:

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

Pracuje s vlastními typy příspěvků a taxonomií.

3
rjb

Mám odpověď na odpověď @ rjb (nemám dostatek pověsti, abych to mohl komentovat, omlouvám se). Byl jsem se dostat "pole na řetězce konverze" chyba s režimem ladění zapnuta, tak jsem udělal foreach smyčky vrácených taxonomií a teď není chyba.

Doufám, že to někomu pomůže!

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

Místo the_terms , můžete použít get_the_terms , který vrátí termín taxonomie objects . Kodex má dokumentaci pro pouze tagovou verzi, get_the_tags .

To by vám něco takového:

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

Udělal jsem nějaké kódování a přidal jsem podporu třídy post, do mého pluginu nazvaného: Správce vlastních příspěvků a taxonomie

V nové formě taxonomie je volena možnost Post class. Což umožňuje přidat category | tag- {slug} a {slug} - {tax_value_slug} do třídy příspěvků.

Stáhnout zde https://github.com/Pravdomil/wp-custom-post-types-man/archive/master.Zip

0
pravdomil