Cách đánh dấu mỗi bài thứ 3


17

Tôi đang làm việc trên một trang web WordPress cho ban nhạc của mình và tôi muốn đánh dấu mỗi bài đăng thứ 3 trên trang blog của chúng tôi để áp dụng một lớp đặc biệt cho nó, có ai có bất kỳ gợi ý nào về cách đạt được điều này không? Bất kỳ trợ giúp là rất rất đánh giá cao, cảm ơn! đá n cuộn.

Câu trả lời:


15

Cách tiếp cận của tôi. Không có chức năng bổ sung, không có bộ lọc. :)

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

Thay thế:

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

Điều này đã giết nó @toscho! Hóa ra cái này hoạt động tốt nhất vì tôi đang sử dụng cái này trên một trang chuyên mục và một fn là những bài viết kiểu dáng ở khắp mọi nơi. cảm ơn người đàn ông, +1. Tôi không nghĩ rằng tôi có quyền riêng tư để +1 chính thức.
Zoran M

1
Điều này có thực sự ảnh hưởng đến giá trị Globals (do toán tử tăng trước) và có khả năng làm hỏng thứ gì đó khác có thể phụ thuộc vào thuộc tính đếm hiện tại không? Ý tôi là, khả năng là mỏng, đúng, nhưng sẽ không an toàn hơn nếu chỉ làm (0 === ($ GLOBALS ['wpdb'] -> current_post + 1)% 3? 'Thứ ba': '')?
Tom Auger

1
@TomAuger Vì một số lý do không rõ ràng, nó dường như không có tác dụng phụ. Nhưng từ góc độ của sự thanh lịch - bạn đã đúng. Tôi đã thêm một ví dụ tốt hơn. :)
fuxia

4
Notice: Undefined property: wpdb::$current_post in
Knott

9

Là một bổ sung cho câu trả lời @helgathevikings

Sử dụng post_group () fn mà không gây ô nhiễm không gian tên toàn cầu

  1. Sử dụng staticcác biến trong một lớp cho phép hành vi tương tự như có các biến toàn cục: Chúng giữ nguyên vị trí và không thay đổi, trừ khi bạn không thay đổi chúng.
  2. Thậm chí tốt hơn (như @Milo đề xuất trong các bình luận), hãy lấy bài đăng hiện tại từ lớp DB.
Ví dụ:
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' );

Cập nhật

Chúng ta có thể sử dụng current_posttài sản của các $wp_queryđối tượng toàn cầu . Chúng ta hãy sử dụng một hàm ẩn danh , với usetừ khóa, để chuyển toàn cầu $wp_querybằng cách tham chiếu ( PHP 5.3+ ):

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

    return $classes;
} );

Hơn nữa, chúng tôi có thể hạn chế nó vào vòng lặp chính với một in_the_loop()kiểm tra có điều kiện.


1
tôi thích nó. không hiểu các biến tĩnh. Một điều nữa để học ngày hôm nay!
đạp xe vào

3
Tại sao không chỉ sử dụng $wpdb->current_post?
Milo

@Milo Bắt tốt +1
kaiser

cảm ơn bạn rất nhiều, thực sự đánh giá cao sự giúp đỡ! thêm điều này ngay bây giờ!
Zoran M

ah chức năng này là badass @kaiser và đẹp đơn giản! Hóa ra tôi cần một cái gì đó chỉ cho một trang chuyên mục. điều này sẽ cứu tôi sau này trong cuộc sống, bạn của tôi, cảm ơn vì đã học cho tôi một cái gì đó mới. +11!
Zoran M

3

nếu chủ đề của bạn sử dụng post_group () để tạo các lớp bài bạn có thể thử. Tôi không chắc chắn 100% về cách nó sẽ xử lý phân trang b / ci không có đủ bài đăng trên bản cài đặt cục bộ của tôi để kiểm tra

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;

 }

Không chắc chắn 100%, nhưng tôi đoán bạn có thể sử dụng staticvar thay vì a globalđể giữ sạch không gian tên. Dù sao: +1.
kaiser

bạn có nghĩa là thay đổi cả $ current_count toàn cầu thành tĩnh $ current_count? dường như không làm gì khi tôi kiểm tra nó không đủ quen thuộc với phạm vi w / biến, mặc dù tôi đồng ý tốt hơn là không làm ô nhiễm không gian tên nếu bạn có thể.
xe đạp vào


3
bạn cũng có thể sử dụng $wpdb->current_postmà không phải tạo một biến khác.
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;

1

Cũng có những cách để làm điều này với CSS và javascript.

Với CSS3, bạn nhắm mục tiêu mỗi bài đăng thứ ba với bộ chọn con thứ n.

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

Hoặc với jQuery, bạn có thể thêm lớp CSS bằng cách sử dụng kỹ thuật tương tự.

jQuery(function($) {
    $( "article.post:nth-child(3n+0)" ).addClass("custom-class");
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.