Получить все пользовательские мета-данные для одного произвольного типа записи

11 мар. 2012 г., 17:08:08
Просмотры: 43.6K
Голосов: 8

Я настроил произвольный тип записи, который имеет три пользовательских мета-поля: name, latitude, longitude. Каждая запись уже отображает имя на интегрированной карте на основе её широты и долготы.

Теперь я хотел бы добавить страницу на мой сайт, которая показывает ВСЕ имена на карте на основе их широты и долготы.

Я, очевидно, знаю, как получить отдельные значения и отобразить их на карте, но у меня не так много опыта в WordPress, поэтому я не уверен, какой будет лучший способ получить всю эту информацию структурированным образом для того, что я пытаюсь сделать. Буду благодарен за любые подсказки, чтобы начать.

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

Если все записи вашего пользовательского типа поста содержат все необходимые мета-поля, вы можете использовать аргумент fields и установить его в значение ids, что значительно ускорит работу, например:

//получаем ID ваших пользовательских записей в виде массива
$posts = get_posts(array(
    'post_type'   => 'your_post_type',
    'post_status' => 'publish',
    'posts_per_page' => -1,
    'fields' => 'ids'
    )
);
//перебираем каждую запись
foreach($posts as $p){
    //получаем нужные мета-данные для каждой записи
    $long = get_post_meta($p,"longitude-key",true);
    $lati = get_post_meta($p,"latitude-key",true);
    $name = get_post_meta($p,"name-key",true);
    //делаем с ними что нужно
}
12 мар. 2012 г. 14:07:35
Комментарии

Bainternet, с некоторыми изменениями в вашем коде мне удалось получить всю информацию на моей странице. Остались небольшие проблемы, но похоже, что теперь у меня получится заставить это работать.

WouterB WouterB
12 мар. 2012 г. 16:21:26

Рад, что смог помочь

Bainternet Bainternet
12 мар. 2012 г. 16:33:50

Возможно, небольшой дополнительный вопрос. Вместо get_post_meta я использовал $name = get_the_term_list($p, "name-key",true); для получения одного из моих значений. Однако это продолжает добавлять "1" перед именем. Непонятно, откуда это берется.

WouterB WouterB
12 мар. 2012 г. 17:35:56

Это происходит потому, что get_the_term_list используется для получения списка терминов таксономии, а не метаданных записи.

Bainternet Bainternet
12 мар. 2012 г. 18:05:41

Да, мне нужен был один термин из таксономии. Функция возвращает значение, но также добавляет "1", и делает это в каждом экземпляре, возвращаемом циклом foreach.

WouterB WouterB
12 мар. 2012 г. 18:34:44
4

Этот код позволит вам получить все записи, у которых указаны долгота, широта и название. Затем вы можете пройтись по ним в цикле для вывода и других операций.

$args = array(
    // основные параметры
    'post_type'   => 'your_post_type',
    'post_status' => 'publish',

    // запрос по метаполям
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key'     => 'longitude-key',
            'value'   => '',
            'compare' => 'NOT'
        ),
        array(
            'key'     => 'latitude-key',
            'value'   => '',
            'compare' => 'NOT'
        ),
        array(
            'key'     => 'name-key',
            'value'   => '',
            'compare' => 'NOT'
        ),
    )
);
$posts = new WP_Query( $args );

Естественно, вам нужно будет его модифицировать, и я настоятельно рекомендую изучить документацию по WP_Query, чтобы точно настроить запрос под ваши нужды, но этот код даст вам основу. Если вы используете его в шаблоне, вся реализация должна быть простой.

11 мар. 2012 г. 18:01:22
Комментарии

Спасибо, при выводе возвращаемого массива результат оказался не совсем таким, как я ожидал. Пожалуй, мне нужно разобраться с этим еще раз.

WouterB WouterB
11 мар. 2012 г. 19:49:18

Это должно вернуть массив объектов записей указанного типа, где longitude-key, latitude-key и name-key не пустые. Разве это не так?

mor7ifer mor7ifer
11 мар. 2012 г. 20:01:56

Пока я убрал name-key и протестировал код. Я вывел возвращаемый массив и скопировал результат в pastebin, чтобы вы могли посмотреть, что он возвращает. http://pastebin.com/uhQHSths

WouterB WouterB
12 мар. 2012 г. 13:11:29

Похоже, запрос не выполняется, попробуйте объявить объект WP_Query отдельно, а затем выполнить метод query() с аргументами $args.

mor7ifer mor7ifer
12 мар. 2012 г. 23:42:47
0

Почему бы не использовать get_metadata()?

Если передать правильные параметры, можно получить все мета-атрибуты записи (кастомные или нет).

Пример:

$META_ATTRIBUTES = get_metadata( 'post', get_the_ID(), '', true );

Обратите внимание, что я не использовал название моего CPT в качестве первого параметра; необходимо использовать 'post', иначе функция ничего не вернет.

Установив третий параметр (meta key) в пустую строку, вы указываете функции получить все мета-атрибуты записи.

1 сент. 2013 г. 18:26:08
0

Это лучший способ получения мета-значений для пользовательских типов записей. Включите этот код в файл function.php, чтобы добавить массив metaval в ответ API, включающий все мета-значения.

add_action( 'rest_api_init', 'create_api_posts_meta_field' );

function create_api_posts_meta_field() {

 // register_rest_field ( 'тип-записи', 'название-поля-для-возврата', массив-колбэков-и-схем() )
 register_rest_field( 'tour', 'metaval', array(
 'get_callback' => 'get_post_meta_for_api',
 'schema' => null,
 )
 );
}

function get_post_meta_for_api( $object ) {
 // получаем ID записи из массива объекта
 $post_id = $object['id'];

 // возвращаем мета-данные записи
 return get_post_meta( $post_id );
}
14 нояб. 2017 г. 10:37:48
0

Здесь мы показываем пример относительного отображения произвольного типа записей в WordPress. В этом коде используются аргументы в массиве и WP_Query с циклом для получения данных записей.

$args = array(  
    'post_status' => 'publish',
    'posts_per_page' => 5,  
    
    );

$loop = new WP_Query( $args ); 
    
while ( $loop->have_posts() ) : $loop->the_post(); 
    the_title(); 
the_excerpt();
endwhile;
22 июл. 2020 г. 16:12:45