วิธีทำเครื่องหมายทุกโพสต์ที่ 3


17

ฉันทำงานในไซต์ WordPress สำหรับวงดนตรีของฉันและฉันต้องการทำเครื่องหมายทุกโพสต์ที่ 3 ในหน้าบล็อกของเราเพื่อให้มีการใช้คลาสพิเศษกับมันทุกคนมีตัวชี้ใด ๆ เกี่ยวกับวิธีการบรรลุเป้าหมายนี้? ความช่วยเหลือใด ๆ ที่ชื่นชมมากขอบคุณ! ร็อคแอนด์โรล.

คำตอบ:


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 (เนื่องจากผู้ดำเนินการเพิ่มขึ้นล่วงหน้า) และอาจทำให้บางอย่างผิดพลาดซึ่งอาจขึ้นอยู่กับคุณสมบัติการนับ current_post ฉันหมายถึงความเป็นไปได้น้อยใช่มั้ย แต่จะปลอดภัยกว่าไหมถ้าทำ (0 === ($ GLOBALS ['wpdb'] -> current_post + 1)% 3? 'สาม': '')?
Tom Auger

1
@TomAuger ด้วยเหตุผลบางอย่างที่ไม่ชัดเจนดังนั้นจึงไม่มีผลข้างเคียงใด ๆ แต่จากมุมมองของความสง่างาม - คุณพูดถูก ฉันเพิ่มตัวอย่างที่ดีกว่า :)
fuxia

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

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วัตถุระดับโลกได้ มาใช้ฟังก์ชั่นนิรนามพร้อมuseคำสำคัญเพื่อส่งผ่านโกลบอล$wp_queryโดยอ้างอิง ( PHP 5.3+ ):

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

3
ทำไมไม่เพียงแค่ใช้$wpdb->current_post?
Milo

@Milo จับได้ดี +1
kaiser

ขอบคุณ dudes มากขอบคุณมากสำหรับความช่วยเหลือ! เพิ่มในตอนนี้!
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
ไกเซอร์

คุณหมายถึงเปลี่ยนทั้ง $ current_count ทั่วโลกเป็นคงที่ $ current_count หรือไม่ ดูเหมือนจะไม่ทำอะไรเลยเมื่อฉันทดสอบ ไม่คุ้นเคยกับขอบเขต w / ตัวแปรที่เพียงพอ แต่ฉันยอมรับว่าดีกว่าที่จะไม่สร้างมลภาวะเนมสเปซถ้าคุณทำได้
helgatheviking


3
คุณสามารถใช้$wpdb->current_postโดยไม่ต้องสร้างตัวแปรอื่น
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

นอกจากนี้ยังมีวิธีในการทำเช่นนี้กับ 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");
});
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.