如何标记每个第三条帖子


17

我正在为我的乐队在WordPress网站上工作,我想在博客页面上的每条第三条帖子上都标上一个特殊的类,有人对如何实现这一目标有任何指示吗?任何帮助都非常非常感谢,谢谢!摇滚乐。

Answers:


15

我的方法。没有额外的功能,没有过滤器。:)

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

替代方案:

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

这杀死了它@toscho!事实证明,此方法效果最好,因为我在类别页面上使用了此方法,而fn到处都在对帖子进行样式设置。谢谢,+ 1。我认为我还没有正式+1的特权。
Zoran M

1
这是否真的会影响Globals的值(由于pre-increment运算符),并可能搞砸了可能取决于current_post count属性的其他内容?我的意思是说,可能性很小,但是,这样做不是更安全吗(0 ===($ GLOBALS ['wpdb']-> current_post + 1)%3?'third':'')吗?
Tom Auger 2012年

1
@TomAuger出于某种不太明显的原因,它似乎没有任何副作用。但是从优雅的角度来看,您是对的。我添加了一个更好的例子。:)
fuxia

4
Notice: Undefined property: wpdb::$current_post in
纳氏

9

作为@helgathevikings答案的补充

使用post_class()fn而不污染全局名称空间

  1. static在类中使用变量与使用全局变量具有相同的行为:它们保持不变并且不会改变,除非您不对其进行更改。
  2. 更好的方法(如@Milo在注释中建议的那样),从DB类中获取当前文章。
这个例子:
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' );

更新资料

我们可以利用current_post全局$wp_query对象的属性。让我们使用带有关键字的匿名函数通过引用(PHP 5.3+use传递全局变量$wp_query

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

    return $classes;
} );

进一步,我们可以通过条件检查将其限制在主循环中in_the_loop()


1
我喜欢。不太了解静态变量。今天还要学习一件事!
helgatheviking 2012年

3
为什么不只是使用$wpdb->current_post
Milo 2012年

@Milo好接球+1
凯撒

非常感谢您,非常感谢您的帮助!立即添加!
Zoran M

嗯,这个功能是badass @kaiser,非常简单!原来我只需要一个类别页面的东西。这将使我在以后的生活中拯救我的朋友,谢谢您学习新的知识。+11!
Zoran M

3

如果您的主题使用post_class()生成帖子类,则可以尝试。我不是100%不确定它将如何处理b / ci分页我本地安装的帖子不足以对其进行测试

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;

 }

不能100%确定,但是我想您可以使用staticvar而不是a global来保持命名空间整洁。无论如何:+1。
kaiser 2012年

您的意思是将全局$ current_count都更改为静态$ current_count?我测试时似乎什么也没做。对变量范围不够熟悉,尽管我同意,如果可以的话,最好不要污染名称空间。
helgatheviking 2012年

请参阅下面
kaiser 2012年

3
您也可以使用$wpdb->current_post而不必创建另一个变量。
Milo 2012年

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;

1

也有使用CSS和javascript做到这一点的方法。

使用CSS3,您可以使用nth-child选择器来定位每三个帖子。

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

或者使用jQuery,您可以使用相同的技术添加CSS类。

jQuery(function($) {
    $( "article.post:nth-child(3n+0)" ).addClass("custom-class");
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.