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>

우리는 문자 그대로 우리가 생각할 수있는 모든 조합, WP_Query 대신에 사용되지 않는 meta_ * 옵션, query_posts, get_posts를 시도했습니다. 메타 값 필드가 표시되지 않는 select 문을 인쇄했습니다. 게시물 (모든 게시물)이 존재하며 db에 존재합니다.

우리는 지금 다음과 같은 주제에 대한 모든 게시물을 보았습니다.

query_posts이며 사용자 정의 필드가 비어 있지 않은 경우에만 결과를 표시합니다

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

제로. 도와주세요...


어떤 버전의 WordPress를 사용하고 있습니까?
MikeSchinkel

@MikeSchinkel-죄송합니다. Mike, 이것을 보지 못했습니다 — 3.1입니다.
robalan

WP 3.5는이 문제를 해결하고 다른 비교 방법을 사용할 수 있습니다
Erenor Paz

답변:


6

안녕 @ 롭 :

방법을 알 수없는 이유는 적어도 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'어떻게 얻었 습니까? WordPress 3.1의 관리 UI는 빈 값을 입력하지 않도록 최선을 다합니다. 도움이 되었기를 바랍니다.


신에게 감사합니다 ... 그래서 우리뿐이 아닙니다. 알아두면 좋을 것 같습니다. @MikeSchinkel에게 감사합니다-그들은 정말로 그것을 코덱에 넣어야합니다 ... 설명을 기대합니다. 감사!!
robalan

@Rob-그래서 나는 3.0 지식을 잃어 버렸고 지금은 3.1에서 그것을 테스트하고 있으며 작동하는 것 같습니다. 두 개의 게시물과 featured_image사용자 정의 필드 가있는 게시물이 있으며 쿼리가 제대로 작동합니다. 무엇을 찾고 있습니까? 검색어에 featured_image맞춤 입력란이 있지만 해당 입력란의 값이 비어있는 게시물이로드 될 가능성 이 있습니까?
MikeSchinkel

@MikeSchinkel-농담 없어요? 예, 그것이 정확히하는 일입니다. 모든 게시물에 feature_image 필드가 있으며 모든 설정이 완료되지 않았습니다. 어쨌든 모든 게시물을로드하고 있습니다.
robalan

@Rob-업데이트 된 답변을 참조하십시오.
MikeSchinkel

@MikeSchinkel-감사합니다! 쿼리에서 post_type을 설정 한 후에도 완벽하게 작동하는 것 같습니다. 빈 값은 의도적 인 것입니다. 모든 게시물에이 추천 이미지가있는 것은 아닙니다 (게시물 미리보기 이미지에 대해서는이 사이트에 적합한 옵션이 아닙니다). 정말 고마워!
robalan

57

이것은 유효한 결과를 가져 오는지 확실하지 않은 값을 쿼리에 가져 오는 데 효과가있는 것 같습니다.

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

결과를 테스트하기 위해 필드를 만들 시간이 없었지만 오늘 함께 일한 쿼리를 보았 NOT IN으며 빈 배열을 가져갈 것입니다.


나는 이것이 오래된 대답이라는 것을 알고 있지만,이 접근법을 시도하는 사람들에게는 ' 'compare' => 'NOT LIKE'대신에 작동합니다.'NOT IN
handsofaten

3
그렇지 않거나 좋아하지 않는 대신! =를 사용하는 것이 훨씬 더 효율적입니다. wordpress.stackexchange.com/a/10286/32863 와 동일 (메타 키에 관한 것이지만 동일한 원칙)
Adam

5
더 깨끗한 해결책 : Adam이 이미 언급 한 것처럼. 사용하는 것입니다 : 'value' => '', 'compare' => '!='
마티 반 발굽

빈 배열이 아닌지 확인해야 할 경우 ...'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의 존재에 따라 게시물을 검색하는 방법을 검색하여 사람들이 찾을 수 있도록 솔루션을 추가했습니다. 메타의 가치는 "무언가", "빈"또는 "널"(메타가 존재하지 않는 경우) 일 수 있기 때문에 아마도 가장 좋은 해결책은 두 옵션을 "AND"관계
Erenor Paz

4

이것은 나를 위해 일한 쿼리입니다. 2011 년 t31os의 답변 비교와 매우 유사하지만 메타 키 / 값은 단순한 텍스트 문자열이므로 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'=> 'NOT LIKE'를 사용하면 여전히 모든 게시물을 가져 왔지만 아마도 그 사실과 관련이있을 수 있습니다. ACF (Advanced Custom Fields) 플러그인을 사용하여 메타 값을 만들었습니다.

코덱의 사용자 정의 필드 매개 변수에 대해 자세히 알아보십시오 .



3

뭔가 빠졌습니까?

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

?>

그렇지 않습니까?


편집 : 코덱에서 : $query = new WP_Query( 'meta_key=featured_image' ); 여기를보십시오 : codex.wordpress.org/Class_Reference/…
Infinity Media

먼저 의견을 추가하는 대신 항상 질문이나 답변을 편집 할 수 있습니다 . 둘째 : 댓글 대신 답을 오용 하지 마십시오 .
카이저

새로운 질문이 있으면 질문하기 단추를 클릭하여 질문하십시오 . 컨텍스트를 제공하는 데 도움이되는 경우이 질문에 대한 링크를 포함하십시오.
카이저

@kaiser-그가 대답하는 것처럼 나에게 보인다. 그는 자신의 코드가 유효한지 묻지 않지만, 그가 작동 할 것이라고 생각하는 것에 대해 냉소적으로 대답한다고 생각합니다.
Nathan

@Nathan 이것은 의견입니다.
카이저

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.