Cómo marcar cada 3ra publicación

17

Estoy trabajando en un sitio de WordPress para mi banda y me gustaría marcar cada 3ra publicación en nuestra página de blog para que se le aplique una clase especial, ¿alguien tiene consejos sobre cómo lograr esto? Cualquier ayuda es muy muy apreciada, gracias! rock and roll.

Zoran M
fuente

Respuestas:

15

Mi acercamiento. Sin función adicional, sin filtro. :)

<?php $GLOBALS['wpdb']->current_post = 0; ?>
<div <?php post_class( 0 === ++$GLOBALS['wpdb']->current_post % 3 ? 'third' : '' ); ?>>

Alternativa:

<div <?php post_class( 0 === ++$GLOBALS['wpdb']->wpse_post_counter % 3 ? 'third' : '' ); ?>>
fuxia
fuente
esto lo mató @toscho! Resulta que este funcionó mejor ya que estoy usando esto en una página de categoría y un fn estaba diseñando publicaciones en todas partes. gracias hombre, +1. No creo que tenga los privilegios para hacer +1 oficialmente.
Zoran M
1
¿Esto realmente no afecta el valor de Globals (debido al operador de pre-incremento) y potencialmente arruina algo más que podría depender de la propiedad current_post count? Quiero decir, la probabilidad es escasa, cierto, pero ¿no sería más seguro hacer (0 === ($ GLOBALS ['wpdb'] -> current_post + 1)% 3? 'Third': '')?
Tom Auger
1
@TomAuger Por alguna razón no tan obvia, no parece tener ningún efecto secundario. Pero desde una perspectiva de elegancia, tienes razón. Agregué un mejor ejemplo. :)
fuxia
44
Notice: Undefined property: wpdb::$current_post in
Knott
9

Como una adición a la respuesta @helgathevikings

Utilice post_class () fn sin contaminar el espacio de nombres global

  1. Usar staticvariables dentro de una clase permite el mismo comportamiento que tener variables globales: permanecen en su lugar y no cambian, a menos que no las modifique.
  2. Aún mejor (como sugirió @Milo en los comentarios), tome la publicación actual de la clase DB.
El ejemplo:
function wpse44845_add_special_post_class( $classes )
{
    // Thanks to @Milo and @TomAuger for the heads-up in the comments
    0 === $GLOBALS['wpdb']->current_post %3 AND $classes[] = 'YOUR CLASS';

    return $classes;
}
add_filter( 'post_class','wpse44845_add_special_post_class' );

Actualizar

Podríamos utilizar la current_postpropiedad del $wp_queryobjeto global . Usemos una función anónima , con la usepalabra clave, para transmitir el global $wp_querypor referencia ( PHP 5.3+ ):

add_filter( 'post_class', function( $classes ) use ( &$wp_query )
{
    0 === $wp_query->current_post %3 AND $classes[] = 'YOUR CLASS';

    return $classes;
} );

Más adelante, podríamos restringirlo al bucle principal con una in_the_loop()verificación condicional.

emperador
fuente
1
me gusta. No entiendo las variables estáticas. ¡Una cosa más para aprender hoy!
helgatheviking
3
¿Por qué no solo usar $wpdb->current_post?
Milo
@Milo Good catch +1
kaiser
muchas gracias muchachos, realmente aprecio la ayuda! agregando esto ahora mismo!
Zoran M
¡Ah, esta función es rudo @kaiser y maravillosamente simple! Resulta que necesitaba algo solo para una página de categoría. Esto me salvará más adelante en mi vida, amigo, gracias por aprenderme algo nuevo. +11!
Zoran M
3

si su tema usa post_class () para generar clases de publicación, puede intentarlo. no estoy 100% seguro de cómo manejará la paginación b / ci no tengo suficientes publicaciones en mi instalación local para probarlo

add_filter('post_class','wpa_44845');

global $current_count;

$current_count = 1;

 function wpa_44845( $classes ){

    global $current_count;

    if ($current_count %3 == 0 ) $classes[] = 'special-class';

    $current_count++;

    return $classes;

 }
helgatheviking
fuente
No estoy 100% seguro, pero supongo que podría usar una staticvar en lugar de una globalpara mantener limpio el espacio de nombres. De todos modos: +1.
kaiser
quieres decir cambiar tanto global $ current_count a static $ current_count? no parece hacer nada cuando lo pruebo. no lo suficientemente familiarizado con alcance variable, aunque estoy de acuerdo en que es mejor no contaminar el espacio de nombres si puede.
helgatheviking
3
También puede usar $wpdb->current_postsin tener que crear otra variable.
Milo
2
$i = 0;
if ( have_posts ) :
while( have_posts ) :
    the_post();

    $class = 'class="BASIC-CLASS';
    if ( 0 === ( $i % 3 ) )
        $class .= 'YOUR-SPECIAL-CLASS';
    $class .= '"';

    echo "<div {$class}>";
        // do stuff
    echo '</div>';

    $i++;
endwhile;
endif;
emperador
fuente
1

También hay formas de hacer esto con CSS y JavaScript.

Con CSS3 apuntas a cada tercera publicación con un enésimo selector secundario.

article.post:nth-child(3n+0)
{
    background-color: #777;
}

O con jQuery, puede agregar la clase CSS utilizando la misma técnica.

jQuery(function($) {
    $( "article.post:nth-child(3n+0)" ).addClass("custom-class");
});
Rohmann
fuente