Làm cách nào tôi chỉ có thể hiển thị bài viết nếu meta_value không trống


36

Ba người đã cố gắng giải quyết vấn đề này và chúng tôi sẽ đến con số không. Tôi muốn chỉ hiển thị các bài đăng có giá trị trong meta_key 'nổi bật_image'.

Vì vậy, ... nếu 'Feature_image' không trống, hãy hiển thị bài đăng. Đây là mã:

      <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>

Chúng tôi đã thử nghĩa đen mọi sự kết hợp mà chúng tôi có thể nghĩ ra, các tùy chọn meta_ * không dùng nữa, query_posts, get_posts, thay vì WP_Query ... Không có gì. In câu lệnh chọn, không có trường giá trị meta nào được hiển thị. Nó tồn tại - cho các bài đăng (cho mỗi bài đăng) và nó tồn tại trong db.

Chúng tôi đã thấy tất cả các bài viết trên đó về chủ đề ngay bây giờ, bao gồm cả:

query_posts và chỉ hiển thị kết quả nếu trường tùy chỉnh không trống

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

Zilch. Hãy giúp tôi...


Bạn đang sử dụng phiên bản WordPress nào?
MikeSchinkel

@MikeSchinkel - Xin lỗi Mike, đã không thấy điều này - Đó là 3.1.
robalan

WP 3.5 khắc phục sự cố này và cho phép bạn sử dụng một phương pháp so sánh khác
Erenor Paz

Câu trả lời:


6

Xin chào @Rob:

Lý do bạn không thể tìm ra cách thực hiện là vì điều đó là không thể, ít nhất là không phải dùng đến SQL. Hãy thử thêm các mục sau vào functions.phptệp của chủ đề của bạn :

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;
}

Nếu bạn có các 'featured_image'trường tùy chỉnh với các giá trị trống, ở trên sẽ lọc chúng ra. Nếu vấn đề của bạn là vấn đề khác, chúng ta sẽ phải xem dữ liệu của bạn trông như thế nào để giải quyết nó.

Một điều tôi tò mò về; Làm thế nào bạn có được giá trị trống cho 'featured_image'? Giao diện người dùng quản trị trong WordPress 3.1 cố gắng hết sức để ngăn bạn nhập các giá trị trống. Hi vọng điêu nay co ich.


Cảm ơn chúa ... vì vậy không chỉ có chúng tôi. Đó là điều tốt để biết, tôi cho rằng. Cảm ơn bạn @MikeSchinkel - Họ thực sự nên đưa nó vào bộ mã ... Mong được giải thích. Cảm ơn!!
robalan

@Rob - Vì vậy, tôi đã tắt kiến ​​thức 3.0 của mình và bây giờ tôi đang thử nghiệm nó trong 3.1 và nó dường như hoạt động. Tôi có hai bài đăng và một bài với featured_imagetrường tùy chỉnh và truy vấn của bạn hoạt động tốt. Bạn đang tìm gì vậy? Có khả năng truy vấn của bạn đang tải các bài đăng có featured_imagetrường tùy chỉnh nhưng giá trị cho trường đó trống không?
MikeSchinkel

@MikeSchinkel - Không đùa đâu? Vâng, đó chính xác là những gì nó đang làm - mỗi bài đăng đều có trường đặc trưng, ​​chúng không phải là tất cả. Dù sao nó cũng đang tải lên tất cả các bài viết.
robalan

@Rob - Xem câu trả lời cập nhật của tôi.
MikeSchinkel

@MikeSchinkel - Cảm ơn bạn! Nó dường như đang hoạt động hoàn hảo, sau khi đặt post_type trong truy vấn cũng. Các giá trị trống là có mục đích - không phải bài đăng nào cũng có hình ảnh nổi bật này (và tôi biết về hình thu nhỏ của bài đăng, đó chỉ là một lựa chọn không tốt cho trang web này). Cám ơn rất nhiều!
robalan

57

Điều này dường như hoạt động để nhận giá trị vào truy vấn, không chắc chắn về việc liệu nó có kéo kết quả hợp lệ hay không ..

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

Không có thời gian để tạo các trường để kiểm tra kết quả, nhưng tôi đã xem các truy vấn tôi đã làm việc với ngày hôm nay và nhận thấy NOT INsẽ vui vẻ nhận một mảng trống.


Tôi biết đây là một câu trả lời cũ, nhưng đối với những người dùng thử apparoach này, nó hoạt động với 'compare' => 'NOT LIKE'thay vì 'NOT IN'
handofaten

3
Chắc chắn sẽ hiệu quả hơn khi sử dụng! = Thay vì không thích hoặc không thích. Tương tự như wordpress.stackexchange.com/a/10286/32863 (đó là về các khóa meta, nhưng cùng một nguyên tắc)
Adam

5
Ngay cả giải pháp sạch hơn: như Adam đã nêu. Là để sử dụng: 'value' => '', 'compare' => '!='
Martijn van Hoof

Nếu bạn cần kiểm tra để đảm bảo đó không phải là một mảng trống ...'value' => array('', array(), serialize(array())), 'compare' => 'NOT IN'
StephanieQ

10

Đây là một câu hỏi cũ, nhưng có vẻ như Wordpress đã sửa "tính năng bị thiếu" này: bây giờ, theo Wordpress Codex có thể kiểm tra sự tồn tại (hoặc không tồn tại) của khóa meta, như thế này

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

Điều này có sẵn tại WP> = 3.5.


EXISTSsẽ hiển thị các giá trị trống không phải là những gì chúng ta sau đây. Giải pháp tốt nhất là 'value' => '', 'compare' => '!=' theo như thử nghiệm của tôi.
Bến

1
@Ben Đó chính xác là những gì OP đã cố gắng, nhưng dường như không có thành công nào. Tôi đã thêm giải pháp của mình để đảm bảo mọi người đi qua bằng cách tìm kiếm một phương thức để truy xuất các bài đăng dựa trên sự tồn tại của meta_key có thể tìm thấy nó. Vì giá trị của meta có thể là "một cái gì đó", "trống rỗng" hoặc "null" (trong trường hợp meta không tồn tại), có lẽ giải pháp tốt nhất là hợp nhất hai tùy chọn với mối quan hệ "VÀ"
Erenor Paz

4

Đây là truy vấn làm việc cho tôi. Rất giống với so sánh trong câu trả lời của t31os từ năm 2011, nhưng vì khóa / giá trị meta chỉ là một chuỗi văn bản đơn giản, nên nó không cần phải là một mảng 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'
);

Vì bất kỳ lý do gì, sử dụng 'meta_value' => '''meta_compare' => '! =' Hoặc 'meta_compare' => 'KHÔNG THÍCH' vẫn kéo tất cả các bài đăng cho tôi, nhưng có lẽ nó có liên quan đến thực tế rằng Tôi đã tạo giá trị meta của mình bằng cách sử dụng plugin Trường tùy chỉnh nâng cao (ACF).

Đọc thêm về các tham số trường tùy chỉnh trong codex .



3

Tui bỏ lỡ điều gì vậy?

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

?>

Sẽ không làm điều đó?


Chỉnh sửa: từ codex: $query = new WP_Query( 'meta_key=featured_image' ); xem tại đây: codex.wordpress.org/Class_Reference/iêu
Infinity Media

Đầu tiên, bạn luôn có thể chỉnh sửa một câu hỏi hoặc câu trả lời thay vì thêm một bình luận. Thứ hai: Đừng lạm dụng câu trả lời thay vì bình luận.
kaiser

Nếu bạn có một câu hỏi mới, vui lòng hỏi nó bằng cách nhấp vào nút Hỏi câu hỏi . Bao gồm một liên kết đến câu hỏi này nếu nó giúp cung cấp bối cảnh.
kaiser

@kaiser - Dường như với tôi như anh đang trả lời. Anh ta không hỏi mã của anh ta có hợp lệ không, nhưng tôi cho rằng loại trả lời mỉa mai câu hỏi với những gì anh ta tin sẽ làm việc.
Nathan

@Nathan Đây là những gì bình luận dành cho.
kaiser

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.