Como marcar cada terceiro post

17

Estou trabalhando em um site WordPress para minha banda e gostaria de marcar cada terceiro post em nossa página de blog para ter uma classe especial aplicada a ele, alguém tem alguma dica sobre como conseguir isso? Qualquer ajuda é muito muito apreciada, obrigado! rock n roll.

Zoran M
fonte

Respostas:

15

Minha abordagem. Sem função extra, sem filtro. :)

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

Alternativo:

<div <?php post_class( 0 === ++$GLOBALS['wpdb']->wpse_post_counter % 3 ? 'third' : '' ); ?>>
fuxia
fonte
isso matou @toscho! Acontece que este funcionou melhor, pois estou usando isso em uma página de categoria e um fn estava estilizando posts em todos os lugares. obrigado cara, +1. Eu não acho que tenho os privs para marcar +1 ainda oficialmente.
Zoran M
1
Isso realmente não afeta o valor Globals (devido ao operador de pré-incremento) e potencialmente estraga outra coisa que possa estar dependendo da propriedade current_post count? Quero dizer, a probabilidade é pequena, certo, mas não seria mais seguro fazer (0 === ($ GLOBALS ['wpdb'] -> current_post + 1)% 3? 'Third': '')?
Tom Auger #
1
@ TomAuger Por alguma razão não tão óbvia, parece não ter nenhum efeito colateral. Mas de uma perspectiva de elegância - você está certo. Eu adicionei um exemplo melhor. :)
fuxia
4
Notice: Undefined property: wpdb::$current_post in
29516 Knott
9

Como complemento à resposta @helgathevikings

Use o post_class () fn sem poluir o espaço para nome global

  1. O uso de staticvariáveis ​​dentro de uma classe permite o mesmo comportamento de ter variáveis ​​globais: elas permanecem no lugar e não mudam, a menos que você não as altere.
  2. Ainda melhor (como o @Milo sugeriu nos comentários), pegue a postagem atual da classe DB.
O exemplo:
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' );

Atualizar

Poderíamos utilizar a current_postpropriedade do $wp_queryobjeto global . Vamos usar uma função anônima , com a usepalavra - chave, para transmitir o global $wp_querypor referência ( PHP 5.3+ ):

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

    return $classes;
} );

Mais adiante, poderíamos restringi-lo ao loop principal com uma in_the_loop()verificação condicional.

kaiser
fonte
1
eu gosto disso. não entendo muito bem variáveis ​​estáticas. mais uma coisa para aprender hoje!
31812 helgatheviking
3
por que não usar $wpdb->current_post?
Milo
@Milo Good catch +1
kaiser
muito obrigado caras, realmente aprecio a ajuda! adicionando isso agora mesmo!
Zoran M
ah essa função é foda @kaiser e lindamente simples! Acontece que eu precisava de algo apenas para uma página de categoria. isso me salvará mais tarde na vida, meu amigo, obrigado por me aprender algo novo. +11!
Zoran M
3

se o seu tema usa post_class () para gerar post classes, você pode tentar. não tenho 100% de certeza de como ele vai lidar com paginação b / ci não tenho posts suficientes na minha instalação local para testá-lo

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
fonte
Não tenho 100% de certeza, mas acho que você pode usar um staticvar em vez de um globalpara manter o namespace limpo. Enfim: +1.
Kaiser #
você quer dizer alterar global $ current_count para static $ current_count? parece não fazer nada quando eu testá-lo. não familiar o suficiente com escopo variável, embora eu concorde que é melhor não poluir o espaço para nome, se puder.
helgatheviking
Veja a resposta abaixo
kaiser 8/12
3
você também pode usar $wpdb->current_postsem precisar criar outra variável.
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;
kaiser
fonte
1

Também existem maneiras de fazer isso com CSS e javascript.

Com CSS3, você segmenta cada terceira postagem com um seletor de enésimo filho.

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

Ou com o jQuery, você pode adicionar a classe CSS usando a mesma técnica.

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