Как отображать только сообщения, поле мета-значения которых не является пустым?
Три человека уже пытались решить эту проблему, и мы приближаемся к нулю. Я хочу показывать только сообщения, которые имеют значение в мета_ключе "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
Пшик. Пожалуйста, помогите...
8 answers
Привет @Роб:
Причина, по которой вы не можете понять, как это сделать, заключается в том, что это невозможно, по крайней мере, не прибегая к 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 делает все возможное, чтобы вы не вводили пустые значения.
Надеюсь, это поможет.
Похоже, это работает для ввода значения в запрос, хотя я не уверен, что он выдает правильные результаты..
'meta_query' => array(
array(
'key' => 'some_key',
'value' => array(''),
'compare' => 'NOT IN'
)
)
Не успел создать поля для проверки результатов, но я наблюдал за запросами, с которыми работал сегодня, и заметил, что NOT IN
с радостью примет пустой массив.
Это старый вопрос, но, похоже, Wordpress исправил эту "недостающую функцию": теперь, согласно Кодексу Wordpress, можно проверить наличие (или отсутствие) мета-ключа, как это
'meta_query' => array(
array(
'key' => 'featured_image',
'compare' => 'EXISTS', //or "NOT EXISTS", for non-existance of this key
)
)
Это доступно по состоянию на WP>=3.5.
Это запрос, который сработал для меня. Очень похоже на сравнение в ответе 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'=>'НЕ НРАВИТСЯ' все равно вытащил все сообщения для меня, но, вероятно, это как-то связано с тем, что я создал свое мета-значение, используя расширенный Плагин пользовательских полей (ACF).
Подробнее о параметрах настраиваемых полей читайте в кодексе.
Это исправлено в WP 3.2-альфа:
Я что-то упускаю?
<?php
$args = array(
'post_type' => 'post',
'posts_per_page' => -1,
'meta_key' => "featured_image"
);
$the_query = new WP_Query( $args );
?>
Разве это не поможет?
Если вы хотите, чтобы мета-значение существовало и имело какое-то значение, отличное от пустой строки:
'meta_query' => [
'relation' => 'AND',
[
'key' => 'some_key',
'compare' => 'EXISTS',
],
[
'key' => 'some_key',
'compare' => '!=',
'value' => ''
]
]
!has_featured_image();
Один лайнер ftw.