WordPress excluye la publicación $sticky duplicada del bucle

6 minutos de lectura

Desde WordPress postes pegajosos la función permite que la publicación se marque como pegajoso en el panel de publicación de publicaciones que se colocará en la parte superior de la página principal de las publicaciones. También tenía la intención de diseñar la publicación adhesiva de manera diferente a las normales dentro del ciclo personalizando El lazo codificación predeterminada de la siguiente manera:

    <?php if (have_posts()) : ?>
    <?php $post = $posts[0]; $c=0;?>
    <?php while (have_posts()) : the_post(); ?>

     <?php $c++;
       if( is_home() && !$paged && $c == 1 ) :?>
         <!--First sticky post content -->

    <?php elseif( is_home() && !$paged && $c == 2 ) :?>
        <!--Second sticky post content -->

    <?php elseif( is_home() && !$paged && $c == 3 ) :?>
        <!--Third sticky post content -->

    <?php else:?>
        <!-- Standard post content -->

    <?php endif;?>
    <?php endwhile; ?>
    <!-- End of the main loop -->
      //pagination

    <?php else : ?>
      <?php _e('Sorry, no posts matched your criteria.'); ?>

    <?php endif; ?>

El resultado es que obtengo las primeras tres publicaciones (marcadas como pegajosas) con un estilo personalizado mientras están duplicadas dentro publicaciones estándar salida en la que no pude deshacerme de.

Traté de reemplazar <?php else : ?> con <?php elseif(!is_sticky()) : ?> pero la página creada que se muestra está “paginada” o tiene un número de página actual mayor que uno. El recuento de publicaciones se resta de las publicaciones fijas según la fecha de publicación de cada página.

Cualquier ayuda para hacer que las publicaciones adhesivas no se dupliquen es muy apreciada.

  • Tienes 2 bucles o solo 1? Comparta amablemente el código completo si es posible …

    – Shramee

    18 de agosto de 2016 a las 8:05

  • Hola @Ehab, suponiendo que solo tengas un ciclo, mira mi respuesta a continuación 😉

    – Shramee

    22 de agosto de 2016 a las 5:39


avatar de usuario
dev_masta

Te sugiero que leas la documentación de WP_Query:
https://codex.wordpress.org/Class_Reference/WP_Query#Pagination_Parameters

Puede crear nuevas consultas (o modificar las existentes) y buscar publicaciones sin las fijas.

No mostrar publicaciones fijas

Excluya todas las publicaciones fijas de la consulta:

$query = new WP_Query( array( 'post__not_in' => get_option( 'sticky_posts' ) ) );

Te sugiero que hagas 2 consultas consecutivas.

El primero para buscar las publicaciones adhesivas y el segundo para buscar todas las demás publicaciones (excluyendo las adhesivas, como se describió anteriormente).

  • Estoy familiarizado con los argumentos de consulta. Eso eliminará por completo las publicaciones adhesivas de todo el ciclo, mientras que las necesito solo en la primera página codex.wordpress.org/Mensajes_adhesivos

    usuario1556571

    16 de agosto de 2016 a las 11:57


  • En ese caso, le sugiero que use dos bucles, el primero para obtener las publicaciones fijas y el segundo para obtener todas las demás publicaciones (excluyendo las fijas).

    – dev_masta

    22 de agosto de 2016 a las 12:25

Para manejar publicaciones adhesivas, haz

<?php
    $sticky_query = new WP_Query( array( 'post__in' => get_option( 'sticky_posts' ) ) );
    while ($sticky_query->have_posts()) : $sticky_query->the_post();
?>

Para manejar publicaciones que no son adhesivas, haga

<?php
    $non_sticky_query = new WP_Query( array( 'post__not_in' => get_option( 'sticky_posts' ) ) ); 
    while ($non_sticky_query->have_posts()) : $non_sticky_query->the_post();
?> 

PD- is_sticky() no funcionará aquí porque supongo que este código se ejecuta en su página de inicio. is_sticky() requerirá el post_id para trabajar según sea necesario en páginas que no sean la página de publicación.

puedes hacer algo como esto is_sticky(get_the_ID()) dentro del ciclo en su código actual.

avatar de usuario
geo hakiadakis

Puede separar las publicaciones de la página de inicio y otras publicaciones como esa:

<?php if (have_posts()) : ?>

<!-- if home page -->
<?php if( is_home() && !$paged ) :?>

  <!-- First page loop -->
  <?php $post = $posts[0]; $c=0;?>
  <?php while (have_posts()) : the_post(); ?>

     <?php $c++;
     if( $c == 1 ) { ?>
     <!--First sticky post content -->
     <?php } ?>

     <?php if( $c == 2 ) { ?>
     <!--Second sticky post content -->
     <?php } ?>

     <?php if( $c == 3 ) { ?>
     <!--Third sticky post content -->
     <?php } ?>

  <?php endwhile; ?>
  <!-- End of first page loop -->

<!-- else if not home page -->
<?php else:?>

  <!-- exclude stuicky posts, then run the standard loop -->
  <?php $query = new WP_Query( array( 'post__not_in' => get_option( 'sticky_posts' ) ) );

  <?php while (have_posts()) : the_post(); ?>
    <!-- Standard post content -->

  <?php endwhile; ?>

<?php endif;?>
<!-- end if home page / else -->
  //pagination

<!-- else if have no posts -->
<?php else : ?>
  <?php _e('Sorry, no posts matched your criteria.'); ?>

<?php endif; ?>
<!-- end if have posts / else -->

puede usar este código para mostrar solo publicaciones fijas

<?php
$args = array(
'posts_per_page' => 4,
'post__in'  => get_option('sticky_posts'), //that will display only sticky posts
);
$my_query = new WP_Query($args);
while($my_query->have_posts()) : $my_query->the_post();
?>
    <!-- sticky posts -->

<?php endwhile; ?>
<?php wp_reset_postdata(); ?>

luego use este código para eliminar solo las publicaciones adhesivas del ciclo

<?php
$args = array(
'posts_per_page' => 4,
'post__not_in' => get_option('sticky_posts') //that will remove only sticky posts
);
$my_query = new WP_Query($args);
while($my_query->have_posts()) : $my_query->the_post();
?>
    <!-- normal posts content without sticky -->

<?php endwhile; ?>
<?php wp_reset_postdata(); ?>

avatar de usuario
Shramee

Simplemente continue en else si la publicación es pegajosa 😉

Poner

<?php if ( is_sticky() ) continue;?>

en la parte superior de la sección else…
Tu código se verá así

<?php if (have_posts()) : ?>
<?php $post = $posts[0]; $c=0;?>
<?php while (have_posts()) : the_post(); ?>

 <?php $c++;
   if( is_home() && !$paged && $c == 1 ) :?>
     <!--First sticky post content -->

<?php elseif( is_home() && !$paged && $c == 2 ) :?>
    <!--Second sticky post content -->

<?php elseif( is_home() && !$paged && $c == 3 ) :?>
    <!--Third sticky post content -->

<?php else:?>
    <?php if ( is_sticky() ) continue;?>
    <!-- Standard post content -->

<?php endif;?>
<?php endwhile; ?>
<!-- End of the main loop -->
  //pagination

<?php else : ?>
  <?php _e('Sorry, no posts matched your criteria.'); ?>

<?php endif; ?>

¿Ha sido útil esta solución?