Mostrar etiquetas en la página de taxonomía

8 minutos de lectura

Actualmente tengo la opción en mi CMS para agregar etiquetas a mi página única de tipo de publicación personalizada.

Ahora, quiero mostrar esta etiqueta como un elemento ‘destacado’. Entonces, en mi taxonomía-‘nombre de archivo’, uso el siguiente código que recopila las etiquetas y las muestra en la página de taxonomía:

            <?php 
        $args = array(
          'tag_slug__and' => array('sector1'),
          'post_type' => array( 'sectors' )
          );
        $loop = new WP_Query( $args );
        while ($loop->have_posts() ) : $loop->the_post();
        ?>
        <a href="https://stackoverflow.com/questions/30256167/<?php echo get_permalink(); ?>">
         <?php echo "<div class="col-md-6" style="margin-bottom:20px;">"; ?>
         <div class="row mobilemargin">
          <div class="categorytiletextsector1">
            <div class="col-md-6 col-sm-6 col-xs-12 nopr"><?php echo get_the_post_thumbnail( $page->ID, 'categoryimage', array('class' => 'sector1img hovereffect')); ?> </div>
            <div class="col-md-6 col-sm-6 col-xs-12">
              <div class="testdiv">
               <h5><?php the_title(); ?></h5>
               <p><?php the_excerpt(); ?></p>
             </div>
           </div>
         </div>
       </div>
       <?php echo "</div>"; ?>

     </a>
   <?php endwhile; ?>
   <?php wp_reset_query(); ?>

Ahora, mi problema es que esto mostrará la etiqueta seleccionada en cada página de categoría ahora, tal como está configurada en la página de taxonomía.

¿Cómo puedo hacer que esto solo se establezca en la categoría actual?

Entonces, si mi artículo está en la ‘categoría A’, ¿solo la página de categoría de ‘A’ mostraría esto, usando la categoría de artículos?

Cualquier ayuda sería genial

Editar. Usé este código, con la esperanza de que funcionara, pero no tuve suerte.

$args = array(
    'tag_slug__and' => array( 'sector1' ),
    'post_type'     => array( 'sectors' ),
    'tax_query'     => array(
        array(
            'taxonomy' => 'sectors',
            'terms'    => get_queried_object_id(),
        ),
    ),
);

  • Alguien tiene una idea al menos ????

    usuario2209033

    17 mayo 2015 a las 14:21

avatar de usuario
Pieter Goosen

Su problema es su consulta personalizada. Una nota muy importante aquí es que nunca cambie la consulta principal por una personalizada en ningún tipo de página de archivo o en la página de inicio. He explicado todo en detalle en este post recientemente. Asegúrese de leerlo y todas las publicaciones vinculadas, ya que esto lo beneficiará mucho.

Su solución sería eliminar su consulta personalizada y reemplazarla con el bucle predeterminado que todos conocemos.

if ( have_posts() ) {
    while ( have_posts() ) {
        the_post();

        // Your template tags and html mark up

    }
}

Si necesita cambiar algo en la consulta principal, use pre_get_posts para hacerlo

EDITAR

Su mejor idea aquí sería utilizar un completo tax_query para mostrar las publicaciones que están en el término y la etiqueta de taxonomía seleccionados

Puedes intentar algo como esto: (Requiere al menos PHP 5.4+. Además, esto no probado)

$q = get_queried_object();
$args = [
    'post_type' => 'sectors',
    'tax_query' => [
        [
            'taxonomy' => $q->taxonomy,
            'terms' => $q->term_id,
            'include_children' => false // Exclude child terms
        ],
        [
            'taxonomy' => 'post_tag',
            'field' => 'slug',
            'terms' => 'sector1', //I believe this is the slug
        ],
    ],
];

Para versiones anteriores de PHP, use lo siguiente

$q = get_queried_object();
$args = array(
    'post_type' => 'sectors',
    'tax_query' => array(
        array(
            'taxonomy' => $q->taxonomy,
            'terms' => $q->term_id,
            'include_children' => false // Exclude child terms
        ),
        array(
            'taxonomy' => 'post_tag',
            'field' => 'slug',
            'terms' => 'sector1', //I believe this is the slug
        ),
    ),
);

EDITAR 2

Para excluir publicaciones que están en el sector1 etiqueta y cualquier otra sectorX etiqueta, puede hacer lo siguiente

Puedes intentar algo como esto: (Requiere al menos PHP 5.4+. Además, esto no probado)

$q = get_queried_object();
$args = [
    'post_type' => 'sectors',
    'tax_query' => [
        [
            'taxonomy' => $q->taxonomy,
            'terms' => $q->term_id,
            'include_children' => false // Exclude child terms
        ],
        [
            'taxonomy' => 'post_tag',
            'field' => 'slug',
            'terms' => 'sector1', //I believe this is the slug
            'operator' => 'NOT_IN'
        ],
    ],
];

Para versiones anteriores de PHP, use lo siguiente

$q = get_queried_object();
$args = array(
    'post_type' => 'sectors',
    'tax_query' => array(
        array(
            'taxonomy' => $q->taxonomy,
            'terms' => $q->term_id,
            'include_children' => false // Exclude child terms
        ),
        array(
            'taxonomy' => 'post_tag',
            'field' => 'slug',
            'terms' => 'sector1', //I believe this is the slug
            'operator' => 'NOT_IN'
        ),
    ),
);

Solo tenga en cuenta que puede pasar una serie de etiquetas al terms parámetro como este

'terms' => array( 'sector1', 'sector2', 'etc' ),

o sintaxis de matriz corta

'terms' => ['sector1', 'sector2', 'etc'],

EDITAR 3

Como esta es su consulta principal, debe realizar algunos cambios. Como he dicho, elimine la consulta personalizada. Su ciclo principal debería verse así

<?php if (have_posts()) : ?> 
    <?php while (have_posts()) : the_post(); ?> 
        <a href="https://stackoverflow.com/questions/30256167/<?php echo get_permalink(); ?>"> 
        <?php echo "<div class="col-md-6 col-sm-6 col-xs-12" style="margin-bottom:30px;">"; ?> 
        <div class="row mobilemargin"> 
            <div class="categorytiletext2"> 
                <div class="col-md-6 col-sm-12 col-xs-12 nopr"><?php echo get_the_post_thumbnail( $page->ID, 'categoryimage', array('class' => 'hovereffect newimgheight')); ?> </div> 
                <div class="col-md-6 col-sm-12 col-xs-12 mobilewhite"> 
                    <div class="testdiv"> 
                        <h5 class="captext"><?php the_title(); ?></h5> 
                        <?php $trimexcerpt = get_the_excerpt(); 

                        $shortexcerpt = wp_trim_words( $trimexcerpt, $num_words = 10, $more="… " ); 

                        echo '<a href="' . get_permalink() . '"><p>' . $shortexcerpt . '</p></a>'; 

                        ?> 
                    </div> 
                </div> 
            </div> 
        </div> 
        <?php echo "</div>"; ?> 

        </a> 
        <!-- If there is no posts, display an error message --> 
    <?php endwhile; 
else: ?> 
    <p><?php _e('Sorry, no posts matched your criteria.'); ?></p> 
<?php endif; ?> 
<!-- If there is no posts, display an error message -->

Ahora puedes usar pre_get_posts para eliminar la etiqueta deseada de sus páginas de taxonomía. En su functions.php, haga lo siguiente: (Requiere PHP 5.3+, y tampoco está probado)

add_action( 'pre_get_posts', function ( $q )
{
    if ( !is_admin() && $q->is_main_query() && $q->is_tax() ) {
       $q->set( 'tag__not_in', array( 145 ) );
    }
});

Para versiones anteriores use

add_action( 'pre_get_posts', 'so30256167_remove_tags' );
function so30256167_remove_tags( $q )
{
    if ( !is_admin() && $q->is_main_query() && $q->is_tax() ) {
       $q->set( 'tag__not_in', array( 145 ) );
    }
}

Solo recuerda cambiar 145 a su etiqueta exacta identificación o una matriz de etiquetasidentificaciones

EDITAR 4

Si no tiene los identificadores de etiquetas, puede usar get_term_by() para obtener la identificación de la etiqueta del slug de la etiqueta. Algo como esto servirá: (Requiere PHP 5.3+, y tampoco está probado)

add_action( 'pre_get_posts', function ( $q )
{
    if ( !is_admin() && $q->is_main_query() && $q->is_tax() ) {
        $tag_object = get_term_by( 'slug', 'sector1', 'post_tag' ); 
        $tagID = $tag_object->term_id; 

       $q->set( 'tag__not_in', array( $tagID ) );
    }
});

Para versiones anteriores use

add_action( 'pre_get_posts', 'so30256167_remove_tags' );
function so30256167_remove_tags( $q )
{
    if ( !is_admin() && $q->is_main_query() && $q->is_tax() ) {
        $tag_object = get_term_by( 'slug', 'sector1', 'post_tag' ); 
        $tagID = $tag_object->term_id; 

       $q->set( 'tag__not_in', array( $tagID ) );
    }
}

Si tiene una serie de slugs de etiquetas, puede reemplazar lo siguiente

$tag_object = get_term_by( 'slug', 'sector1', 'post_tag' ); 
$tagID = $tag_object->term_id; 

$q->set( 'tag__not_in', array( $tagID ) );/*

con

$tag_array = array( 'slug1', 'slug2', 'slug3' );
foreach ( $tag_array as $tag ) {
    $tag_object = get_term_by( 'slug', $tag, 'post_tag' ); 
    $tagids[] = $tag_object->term_id;
} 
$q->set( 'tag__not_in', $tagids );

Solo recuerda cambiar las babosas en consecuencia.

EDITAR 5

Tu código final en functions.php con pre_get_posts debiera ser

add_action( 'pre_get_posts', 'so30256167_remove_tags' );
function so30256167_remove_tags( $q )
{
    if ( !is_admin() && $q->is_main_query() && $q->is_tax() ) {
        $tag_array = array( 'sector1', 'sector2', 'sector3', 'sector4' );
        foreach ( $tag_array as $tag ) {
            $tag_object = get_term_by( 'slug', $tag, 'post_tag' ); 
            $tagids[] = $tag_object->term_id;
        } 
        $q->set( 'tag__not_in', $tagids );    
    }
}

  • creo que no entendí bien tu pregunta

    – Pieter Goosen

    17 mayo 2015 a las 14:50

  • The Loop está funcionando, está recibiendo las publicaciones que están etiquetadas, pero las mostrará en CADA categoría. Solo necesito una forma de hacer que solo se muestre en la categoría a la que se relaciona también, lo cual pensé que había hecho con los ‘términos’ => get_queried_object_id(),

    usuario2209033

    17 mayo 2015 a las 14:53

  • Ok, no entiendo tu pregunta, ¿es este tu ciclo principal?

    – Pieter Goosen

    17 mayo 2015 a las 14:56

  • Esto es solo un bucle, que obtiene cualquier publicación etiquetada con el nombre ‘sector1’. Este bucle funciona bien, obtiene la publicación etiquetada y la muestra. Pero lo muestra en todas las categorías, necesito que solo se muestre en la categoría a la que pertenece

    usuario2209033

    17 mayo 2015 a las 14:58

  • Tu terminología me confunde, ¿qué es exactamente? sector1. ¿Cómo creaste esto? ¿Conoces la diferencia entre categorías, taxonomías y términos? ¿Qué es lo que estás tratando de hacer? ¿Qué sucede cuando reemplaza todo su código (bucle personalizado) con el bucle en mi respuesta?

    – Pieter Goosen

    17 mayo 2015 a las 15:05

¿Ha sido útil esta solución?