ฉันจะแสดงโพสต์ได้อย่างไรถ้า meta_value ไม่ว่างเปล่า


36

มีสามคนที่พยายามแก้ไขปัญหานี้แล้วและเรากำลังจะมาถึง ฉันต้องการแสดงเฉพาะโพสต์ที่มีค่าใน meta_key 'featured_image'

ดังนั้น ... หาก 'featured_image' ไม่ว่างแสดงโพสต์ นี่คือรหัส:

      <ul>
      <?php
      $args = array(
        'showposts' => 5,
        'meta_query' => array(
          array(
            'key' => 'featured_image',
            'value' => '',
            'compare' => '!='
            )
          )
      );
      $ft_pagination = new WP_Query( $args );
      ?>
      <?php while ($ft_pagination->have_posts()) : $ft_pagination->the_post(); ?>
        <?php $ftimage = get_post_meta(get_the_id(), 'featured_image', TRUE); ?>
        <li>
          <article>
            <a href="">
            <?php if ($ftimage): ?>
              <img src="<?php bloginfo('template_directory'); ?>/timthumb.php?src=<?php echo $ftimage; ?>&w=84&h=60" alt="" />
            <?php else: ?>
              <img src="<?php bloginfo('template_directory'); ?>/timthumb.php?src=/wp-content/themes/ssv/images/review-default.gif&w=84&h=60" alt="" />
            <?php endif; ?>
            </a>
          </article>
        </li>
      <?php
      endwhile;

      wp_reset_query();
      ?>
      </ul>

เราได้ลองใช้ชุดค่าผสมทุกตัวที่เรานึกถึงตัวเลือก meta_ * ที่คัดค้าน, query_posts, get_posts แทน WP_Query ... ไม่มีอะไรเลย พิมพ์คำสั่ง select ไม่มีฟิลด์ค่าเมตาแสดง มันมีอยู่ - สำหรับโพสต์ (สำหรับทุกโพสต์) และมีอยู่ในฐานข้อมูล

เราได้เห็นทุกโพสต์ในหัวข้อในตอนนี้รวมถึงสิ่งเหล่านี้:

query_posts และแสดงผลลัพธ์เฉพาะเมื่อฟิลด์ที่กำหนดเองไม่ว่างเปล่า

http://scribu.net/wordpress/advanced-metadata-queries.html

zilch กรุณาช่วย...


คุณใช้เวิร์ดเพรสรุ่นไหน?
MikeSchinkel

@MikeSchinkel - ขออภัยไมค์ไม่เห็นสิ่งนี้ - มันคือ 3.1
robalan

WP 3.5 แก้ไขปัญหานี้และให้คุณใช้วิธีการเปรียบเทียบที่แตกต่างกัน
Erenor Paz

คำตอบ:


6

สวัสดี@ Rob:

เหตุผลที่คุณไม่สามารถหาวิธีการทำได้เนื่องจากเป็นไปไม่ได้อย่างน้อยก็ไม่ควรใช้ SQL ลองเพิ่มสิ่งต่อไปนี้ในfunctions.phpไฟล์ธีมของคุณ:

add_filter('posts_where','yoursite_posts_where',10,2);
function yoursite_posts_where($where,$query) {
  global $wpdb;
  $new_where = " TRIM(IFNULL({$wpdb->postmeta}.meta_value,''))<>'' ";
  if (empty($where))
    $where = $new_where;
  else
    $where = "{$where} AND {$new_where}";
  return $where;
}

หากคุณมี'featured_image'ฟิลด์ที่กำหนดเองซึ่งมีค่าว่างไว้ด้านบนจะกรองออก หากปัญหาของคุณเป็นอย่างอื่นเราจะต้องดูว่าข้อมูลของคุณมีลักษณะอย่างไรในการแก้ไข

สิ่งหนึ่งที่ฉันอยากรู้เกี่ยวกับ; คุณได้รับค่าว่างเปล่าเป็น'featured_image'อย่างไร admin UI ใน WordPress 3.1 ทำได้ดีที่สุดเพื่อป้องกันไม่ให้คุณป้อนค่าว่าง หวังว่านี่จะช่วยได้


ขอบคุณพระเจ้า ... มันไม่ใช่แค่เรา นั่นเป็นเรื่องดีที่ฉันรู้ ขอบคุณ @MikeSchinkel - พวกเขาควรจะใส่มันลงใน codex ... รอคอยคำอธิบาย ขอบคุณ !!
robalan

@Rob - ดังนั้นฉันจะปิดความรู้ 3.0 ของฉันและตอนนี้ฉันกำลังทดสอบใน 3.1 และดูเหมือนจะทำงาน ฉันมีสองโพสต์และอีกอันที่มีfeatured_imageฟิลด์กำหนดเอง คุณกำลังค้นหาอะไร มีโอกาสที่แบบสอบถามของคุณกำลังโหลดโพสต์ที่มีfeatured_imageเขตข้อมูลที่กำหนดเอง แต่ค่าของเขตข้อมูลนั้นว่างเปล่าหรือไม่
MikeSchinkel

@MikeSchinkel - ไม่ล้อเล่น? ใช่นั่นคือสิ่งที่มันทำ - โพสต์ทุกคนมีฟิลด์ Featured_image พวกเขาไม่ได้ตั้งค่าทั้งหมด มันกำลังโหลดโพสต์ทั้งหมดอยู่ดี
robalan

@Rob - ดูคำตอบที่อัปเดตของฉัน
MikeSchinkel

@MikeSchinkel - ขอบคุณ! ดูเหมือนว่าจะทำงานได้อย่างสมบูรณ์แบบหลังจากตั้งค่า post_type ในแบบสอบถามด้วย ค่าว่างเปล่ามีจุดประสงค์ - ไม่ใช่ทุกโพสต์มีภาพเด่นนี้ (และฉันรู้เกี่ยวกับภาพขนาดย่อของโพสต์มันไม่ใช่ตัวเลือกที่ดีสำหรับเว็บไซต์นี้) ขอบคุณมาก!
robalan

57

ดูเหมือนว่าจะทำงานเพื่อรับค่าลงในแบบสอบถามไม่แน่ใจว่าจะดึงผลลัพธ์ที่ถูกต้องแม้ว่า ..

'meta_query' => array(
    array(
        'key' => 'some_key',
        'value'   => array(''),
        'compare' => 'NOT IN'
    )
)

ไม่มีเวลาในการสร้างเขตข้อมูลเพื่อทดสอบผลลัพธ์ แต่ฉันได้ดูข้อความค้นหาที่ฉันได้ทำงานกับวันนี้และสังเกตว่าNOT INจะใช้อาร์เรย์ที่ว่างเปล่าอย่างมีความสุข


ฉันรู้ว่านี่เป็นคำตอบเก่า แต่สำหรับผู้ที่ลองใช้ apparoach นี้มันสามารถใช้'compare' => 'NOT LIKE'แทน'NOT IN'
handsofaten

3
มีประสิทธิภาพมากขึ้นในการใช้! = แทนที่จะไม่ชอบหรือไม่ชอบ เหมือนกับwordpress.stackexchange.com/a/10286/32863 (นั่นเป็นเรื่องเกี่ยวกับเมตาคีย์ แต่เป็นหลักการเดียวกัน)
อดัม

5
แม้แต่น้ำยาที่สะอาดกว่า: เหมือนที่อดัมระบุไว้แล้ว คือการใช้: 'value' => '', 'compare' => '!='
Martijn van Hoof

หากคุณจำเป็นต้องตรวจสอบเพื่อให้แน่ใจว่ามันไม่ได้เป็นอาร์เรย์ว่างเปล่า ...'value' => array('', array(), serialize(array())), 'compare' => 'NOT IN'
StephanieQ

10

นี่เป็นคำถามเก่า แต่ดูเหมือนว่า Wordpress ได้แก้ไข "คุณสมบัติที่หายไป": ตอนนี้ตามWordpress Codexเป็นไปได้ที่จะตรวจสอบการมีอยู่ (หรือไม่มีอยู่) ของคีย์เมตาเช่นนี้

'meta_query' => array(
    array(
        'key' => 'featured_image',
        'compare' => 'EXISTS', //or "NOT EXISTS", for non-existance of this key
    )
)

สิ่งนี้มีให้ตั้งแต่ WP> = 3.5


EXISTSจะแสดงค่าว่างซึ่งไม่ใช่สิ่งที่เราเป็นอยู่หลังจากที่นี่ ทางออกที่ดีที่สุดคือ'value' => '', 'compare' => '!=' การทดสอบของฉัน
เบ็น

1
@ Ben นั่นคือสิ่งที่ OP พยายาม แต่ดูเหมือนจะไม่ประสบความสำเร็จ ฉันได้เพิ่มวิธีแก้ไขปัญหาของฉันเพื่อให้แน่ใจว่าผู้คนที่ผ่านการค้นหาวิธีเรียกโพสต์ตามการมีอยู่ของ meta_key สามารถค้นพบได้ เนื่องจากค่าของเมตาอาจเป็น "บางอย่าง", "ว่างเปล่า" หรือ "null" (ในกรณีที่ไม่มีเมตา) อาจเป็นทางออกที่ดีที่สุดที่จะรวมสองตัวเลือกเข้าด้วยกันด้วยความสัมพันธ์ "และ"
Erenor Paz

4

นี่คือแบบสอบถามที่เหมาะกับฉัน คล้ายกันมากกับการเปรียบเทียบในคำตอบของ t31os จาก 2011 แต่เนื่องจากเมตาคีย์ / ค่าเป็นเพียงสตริงข้อความธรรมดาจึงไม่จำเป็นต้องเป็นอาร์เรย์ meta_query

$args = array(
    'posts_per_page' => 5,//replaced 'showposts' in version 2.1
    'meta_key' => 'featured_image',
    'meta_value' => array(''),
    'meta_compare' => 'NOT IN'
);

ไม่ว่าด้วยเหตุผลใดก็ตามการใช้'meta_value' => ''และ'meta_compare' => '! ='หรือ'meta_compare' => 'ไม่ชอบ'ยังดึงโพสต์ทั้งหมดสำหรับฉัน แต่อาจมีบางสิ่งที่เกี่ยวข้องกับข้อเท็จจริงที่ว่า ฉันสร้างค่าเมตาของฉันโดยใช้ปลั๊กอิน Advanced Custom Fields (ACF)

อ่านข้อมูลเพิ่มเติมเกี่ยวกับพารามิเตอร์ฟิลด์ที่กำหนดเองใน Codex



3

ฉันพลาดอะไรไปรึเปล่า?

<?php 
    $args = array(
        'post_type' => 'post',
        'posts_per_page' => -1,
        'meta_key' => "featured_image"
    );
    $the_query = new WP_Query( $args ); 

?>

จะไม่ทำเช่นนั้น?


แก้ไข: จาก codex: $query = new WP_Query( 'meta_key=featured_image' ); ดูที่นี่: codex.wordpress.org/Class_Reference/ ......
Infinity Media

ก่อนอื่นคุณสามารถแก้ไขคำถามหรือคำตอบได้ตลอดเวลาแทนที่จะเพิ่มความคิดเห็น ที่สอง: อย่าใช้คำตอบที่ผิดแทนที่จะเป็นความคิดเห็น
ไกเซอร์

หากคุณมีคำถามใหม่โปรดขอได้โดยคลิกที่ถามคำถามปุ่ม รวมลิงค์ไปยังคำถามนี้หากช่วยระบุบริบท
ไกเซอร์

@kaiser - ดูเหมือนว่าฉันจะตอบเขา เขาไม่ได้ถามว่ารหัสของเขาถูกต้องหรือไม่ แต่ฉันคิดว่าการตอบแบบประชดประชันด้วยสิ่งที่เขาเชื่อว่าจะใช้ได้
นาธาน

@Nathan นี่คือสิ่งที่แสดงความคิดเห็น
ไกเซอร์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.