Как получить post_meta без ID поста в WordPress

8 апр. 2013 г., 14:41:11
Просмотры: 14.6K
Голосов: 5

Я хочу получить все свои 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 из этого запроса. Есть ли способ сделать это? Спасибо.

0
Все ответы на вопрос 2
2

$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);
8 апр. 2013 г. 15:05:34
Комментарии

Есть один вопрос, который я просто обязан задать. Когда я использую 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 ) ) ;. Как я могу вывести их в одну строку без объектов?

Adi Adi
8 апр. 2013 г. 15:48:12

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

Bainternet Bainternet
8 апр. 2013 г. 16:02:32
6

Вы можете запросить таблицу 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 />";
  }
}
8 апр. 2013 г. 14:53:21
Комментарии

Проблема такая же, как я писал выше. Вот мой комментарий. Единственное, что я хочу уточнить: когда я использую 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 ) ) ;. Как я могу вывести их в одну строку без объектов?

Adi Adi
8 апр. 2013 г. 16:02:09

Обновил свой ответ.

RRikesh RRikesh
8 апр. 2013 г. 17:12:51

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

kaiser kaiser
10 апр. 2013 г. 01:15:26

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

RRikesh RRikesh
10 апр. 2013 г. 08:09:39

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

kaiser kaiser
10 апр. 2013 г. 11:50:44

Хорошо, спасибо большое, я придерживаюсь метода prepare! :)

RRikesh RRikesh
10 апр. 2013 г. 12:19:50
Показать остальные 1 комментариев