Wie markiert man jeden 3. Beitrag?

17

Ich arbeite an einer WordPress-Site für meine Band und möchte jeden dritten Post auf unserer Blog-Seite markieren, damit eine spezielle Klasse darauf angewendet wird. Hat jemand einen Hinweis, wie dies erreicht werden kann? Jede Hilfe ist sehr sehr dankbar, danke! Rock 'n' Roll.

Zoran M
quelle

Antworten:

15

Mein Ansatz. Keine Zusatzfunktion, kein Filter. :)

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

Alternative:

<div <?php post_class( 0 === ++$GLOBALS['wpdb']->wpse_post_counter % 3 ? 'third' : '' ); ?>>
fuxia
quelle
das hat es getötet @toscho! Es stellte sich heraus, dass dies am besten funktioniert hat, da ich dies auf einer Kategorieseite verwende und eine FN überall Beiträge stylt. danke mann, +1. Ich glaube nicht, dass ich die Privilegien für +1 noch offiziell habe.
Zoran M
1
Beeinflusst dies nicht tatsächlich den Globals-Wert (aufgrund des Operators vor dem Inkrementieren) und kann möglicherweise etwas anderes vermasseln, das möglicherweise von der Eigenschaft current_post count abhängt? Ich meine, die Wahrscheinlichkeit ist gering, richtig, aber wäre es nicht sicherer, einfach (0 === ($ GLOBALS ['wpdb'] -> current_post + 1)% 3? 'Third': '') zu tun?
Tom Auger
1
@TomAuger Aus irgendeinem nicht so offensichtlichen Grund scheint es keine Nebenwirkung zu haben. Aber aus einer Perspektive der Eleganz - Sie haben Recht. Ich habe ein besseres Beispiel hinzugefügt. :)
fuxia
4
Notice: Undefined property: wpdb::$current_post in
Knott
9

Als Ergänzung zu @helgathevikings antworten

Verwenden Sie die Funktion post_class () fn, ohne den globalen Namespace zu verschmutzen

  1. Die Verwendung von staticVariablen in einer Klasse hat dasselbe Verhalten wie die Verwendung globaler Variablen: Sie bleiben an Ort und Stelle und ändern sich nicht, sofern Sie sie nicht ändern.
  2. Noch besser (wie @Milo in den Kommentaren vorgeschlagen hat), nimm den aktuellen Beitrag aus der DB-Klasse.
Das Beispiel:
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' );

Aktualisieren

Wir könnten die current_postEigenschaft des globalen $wp_queryObjekts nutzen. Verwenden wir eine anonyme Funktion mit dem useSchlüsselwort, um die globale $wp_queryReferenz weiterzugeben ( PHP 5.3+ ):

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

    return $classes;
} );

Weiterhin könnten wir es mit einer bedingten Prüfung auf die Hauptschleife beschränken in_the_loop().

Kaiser
quelle
1
ich mag das. verstehe nicht ganz statische Variablen. noch etwas zu lernen heute!
Helgatheviking
3
warum nicht einfach benutzen $wpdb->current_post?
Milo
@Milo Guter Fang +1
Kaiser
Vielen Dank Jungs, wirklich danke für die Hilfe! Füge dies jetzt hinzu!
Zoran M
ah diese funktion ist badass @kaiser und wunderschön einfach! Es stellte sich heraus, dass ich etwas nur für eine Kategorieseite brauchte. Das wird mich später im Leben retten, mein Freund, danke, dass du mir etwas Neues beigebracht hast. +11!
Zoran M
3

Wenn Ihr Theme post_class () verwendet, um Post-Klassen zu generieren, können Sie es versuchen. Ich bin mir nicht 100% sicher, wie es mit Paginierung umgehen wird

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
quelle
Nicht 100% sicher, aber ich vermute, Sie könnten ein staticvar anstelle von a verwenden global, um den Namespace sauber zu halten. Trotzdem: +1.
Kaiser
Sie meinen, Sie ändern sowohl globales $ current_count als auch statisches $ current_count? scheint nichts zu tun, wenn ich es teste. nicht vertraut genug mit variablem Umfang, obwohl ich damit einverstanden bin, ist es besser, den Namespace nicht zu verschmutzen, wenn Sie können.
Helgatheviking
Siehe die Antwort unten
Kaiser
3
Sie können auch verwenden, $wpdb->current_postohne eine andere Variable erstellen zu müssen.
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
quelle
1

Es gibt auch Möglichkeiten, dies mit CSS und Javascript zu tun.

Mit CSS3 zielen Sie auf jeden dritten Beitrag mit einem Selektor für n-te Kinder.

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

Oder mit jQuery können Sie die CSS-Klasse mit derselben Technik hinzufügen.

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