Получить все пользовательские мета-данные для одного произвольного типа записи
Я настроил произвольный тип записи, который имеет три пользовательских мета-поля: name, latitude, longitude. Каждая запись уже отображает имя на интегрированной карте на основе её широты и долготы.
Теперь я хотел бы добавить страницу на мой сайт, которая показывает ВСЕ имена на карте на основе их широты и долготы.
Я, очевидно, знаю, как получить отдельные значения и отобразить их на карте, но у меня не так много опыта в WordPress, поэтому я не уверен, какой будет лучший способ получить всю эту информацию структурированным образом для того, что я пытаюсь сделать. Буду благодарен за любые подсказки, чтобы начать.
Если все записи вашего пользовательского типа поста содержат все необходимые мета-поля, вы можете использовать аргумент 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);
//делаем с ними что нужно
}

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

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

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

Этот код позволит вам получить все записи, у которых указаны долгота, широта и название. Затем вы можете пройтись по ним в цикле для вывода и других операций.
$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
, чтобы точно настроить запрос под ваши нужды, но этот код даст вам основу. Если вы используете его в шаблоне, вся реализация должна быть простой.

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

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

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

Почему бы не использовать get_metadata()?
Если передать правильные параметры, можно получить все мета-атрибуты записи (кастомные или нет).
Пример:
$META_ATTRIBUTES = get_metadata( 'post', get_the_ID(), '', true );
Обратите внимание, что я не использовал название моего CPT в качестве первого параметра; необходимо использовать 'post', иначе функция ничего не вернет.
Установив третий параметр (meta key) в пустую строку, вы указываете функции получить все мета-атрибуты записи.

Это лучший способ получения мета-значений для пользовательских типов записей. Включите этот код в файл 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 );
}

Здесь мы показываем пример относительного отображения произвольного типа записей в 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;
