Как получить post_meta без ID поста в WordPress
Я хочу получить все свои posts-meta
, но на основе только key
. Например, основной запрос для получения post-meta выглядит так:
<?php $meta_values = get_post_meta($post_id, $key, $single); ?>
Теперь я хочу получить эти post-meta
только на основе key
. Мой текущий запрос для получения post-meta:
<?php echo get_post_meta($post->ID, 'custom_tags'.$userID, true); ?>
И я хочу убрать $post->ID
из этого запроса. Есть ли способ сделать это? Спасибо.

$post->ID
— это то, что отличает мета-значение среди всех записей с одинаковым мета-ключом.
Таким образом, если вы хотите сократить вызов get_post_meta
для текущей записи, вы можете сделать так:
function get_cuurent_post_meta($key){
global $post;
return get_post_meta($post->ID,$key,true);
}
И вызывать её следующим образом:
echo get_cuurent_post_meta('custom_tags'.$userID);
Если же вам нужно получить мета-данные не текущей записи, а любой другой, можно использовать следующий код:
function get_meta_value_by_key($meta_key,$limit = 1){
global $wpdb;
if (1 == $limit)
return $value = $wpdb->get_var( $wpdb->prepare("SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = %s LIMIT 1" , $meta_key) );
else
return $value = $wpdb->get_results( $wpdb->prepare("SELECT meta_value FROM $wpdb->postmeta WHERE meta_key = %s LIMIT %d" , $meta_key,$limit) );
}
Чтобы получить первое мета-значение по указанному ключу, вызовите функцию так:
echo get_meta_value_by_key('custom_tags'.$userID);
А чтобы получить все мета-значения по этому ключу, используйте параметр $limit
, например:
$post_meta_array = get_meta_value_by_key('custom_tags'.$userID, 999);

Есть один вопрос, который я просто обязан задать. Когда я использую echo
для $post_meta_array
, он показывает Array. А когда я использую print_r($post_meta_array)
, он показывает данные примерно так: Array (
[0] => stdClass Object ( [meta_value] => $custom_tags )
[1] => stdClass Object ( [meta_value] => tag2,tag3,tag4 )
[2] => stdClass Object ( [meta_value] => garlic,soupe )
) ;
. Как я могу вывести их в одну строку без объектов?

Вы можете изменить вывод get_results, а затем, когда у вас будет массив, использовать implode

Вы можете запросить таблицу postmeta
напрямую, используя что-то вроде:
global $wpdb;
$metas = $wpdb->get_results(
$wpdb->prepare("SELECT meta_value FROM $wpdb->postmeta where meta_key = %s", 'add_your_key_here')
);
echo '<pre>';
print_r( $metas );
echo '</pre>';
ОБНОВЛЕНИЕ
После получения $metas
, передайте их в цикл для отображения значений:
if( count($metas) > 0 ){ #проверяем, есть ли результаты
foreach ($metas as $meta){
echo $meta->meta_value . "<br />";
}
}

Проблема такая же, как я писал выше. Вот мой комментарий.
Единственное, что я хочу уточнить: когда я использую print_r($metas)
, он показывает мне данные примерно так: Array ( [0] => stdClass Object ( [meta_value] => $custom_tags ) [1] => stdClass Object ( [meta_value] => tag2,tag3,tag4 ) [2] => stdClass Object ( [meta_value] => garlic,soupe ) ) ;
. Как я могу вывести их в одну строку без объектов?

@RRikesh Пожалуйста, ознакомься с $wpdb->prepare()
. Всегда подготавливай свои запросы, без исключений.

@kaiser Спасибо, я обновил свой ответ. Кстати, стоит ли мне использовать подготовку, даже если я жестко прописываю значение?

По сути, это замена sprintf()
, которая заботится о замене %s
и %d
. Поэтому я бы все равно это сделал. Хотя бы для других людей, читающих мой код, или на случай, если позже я перейду на динамическую переменную. Чтобы ответить на твой вопрос: Нет, если это частный случай ;)
