Как получить все произвольные поля любого типа записи
У меня есть несколько типов записей. Я хочу получить все произвольные поля, связанные с этим типом записи.
Пример:
Запись
-- изображение
-- Избранное изображение
-- содержимое
Мне нужно получить все поля или произвольные поля в массиве. Я нашел решение отсюда, но оно не соответствует моим целям:
echo '<pre>';
print_r(get_post_custom($post_id));
echo '</pre>';

Возможности типов записей
Существует несколько способов получить список "возможностей", которые поддерживает определённый тип записи. Самый простой — использовать функцию get_all_post_type_supports()
:
$post_type_features = get_all_post_type_supports( 'post' );
print_r( $post_type_features );
/* Массив
* (
* [0] => author
* [1] => editor
* [2] => thumbnail
* [3] => excerpt
* [4] => trackbacks
* [5] => custom-fields
* [6] => comments
* [7] => revisions
* [8] => post-formats
* [9] => title
* )
*/
Также можно использовать post_type_supports()
для проверки поддержки конкретных возможностей типом записи.
Ещё один способ проверить возможности типа записи — получить его объект и проверить свойство $supports
:
$post_type_object = get_post_type_object( 'post' );
print_r( $post_type_object->supports );
Произвольные поля
Поскольку произвольные поля — это метаданные записи, которые связаны с каждой записью индивидуально, а не с типом записи, нет прямого способа получить список имён произвольных полей, используемых определённым типом записи.
Вместо этого вам придётся вручную составлять массив, перебирая все записи нужного типа и используя get_metadata( $post_id )
или get_post_custom_keys( $post_id )
для получения всех произвольных полей, сохранённых для каждой записи. Это потенциально очень ресурсоёмкая операция, и выполнять её следует как можно реже — если вы планируете делать это чаще, чем раз в неделю или месяц, настоятельно рекомендую рассмотреть альтернативные способы достижения вашей цели.
Также можно использовать пользовательский SQL-запрос для получения этой информации, что, без сомнения, будет значительно производительнее, чем запрос метаданных для каждой записи определённого типа.

Добавьте следующий код в functions.php
для ACF
function get_all_meta($type){
global $wpdb;
$result = $wpdb->get_results($wpdb->prepare(
"SELECT post_id,meta_key,meta_value FROM wp_posts,wp_postmeta WHERE post_type = %s
AND wp_posts.ID = wp_postmeta.post_id", $type
), ARRAY_A);
return $result;
}
function acf(){
$options = array();
$acf = get_all_meta('acf');
foreach($acf as $key => $value){
$options['post_type'][$value['post_id']]['post_id'] = $value['post_id'];
$test = substr($value['meta_key'], 0, 6);
if($test === 'field_'){
$post_types = maybe_unserialize( $value['meta_value'] );
$options['post_type'][$value['post_id']]['key'][] = $post_types['key'];
$options['post_type'][$value['post_id']]['key'][] = $post_types['name'];
$options['post_type'][$value['post_id']]['key'][] = $post_types['type'];
}
if($value['meta_key'] == 'rule'){
$post_types = maybe_unserialize( $value['meta_value'] );
$options['post_type'][$value['post_id']]['post_types'] = $post_types['value'];
}
}
return $options;
}
Это даст вам массив значений post meta key для ACF.
Как использовать
foreach(acf() as $key => $value){
update_post_meta(76, $value['type'], 'Steve');
}
Для Pods
function pods(){ global $wpdb; //получаем ID типов записей pods.
$result = $wpdb->get_results($wpdb->prepare(
"SELECT ID,post_title,post_parent FROM wp_posts WHERE post_type = %s", $type
), ARRAY_A);
// для каждого поля типа записи pods создается отдельный тип записи, поэтому снова делаем запрос для получения результата.
$pods_field_post_type = array();
foreach($result as $value){
$pods_field_post_type = $wpdb->get_results($wpdb->prepare(
"SELECT ID,post_title,post_name FROM wp_posts WHERE post_type = %s
AND post_parent = %d
", '_pods_field',$value["ID"]
), ARRAY_A);
}
$fields = array();
foreach($pods_field_post_type as key => $value):
$podsAPI = new PodsAPI();
$pod = $podsAPI->load_pod( array( 'name' => '
post' ));
$fields[] = $pod['fields'][$value['post_name']]['type'];
endforeach;
}
print_r($fields);
Как использовать
foreach($fields as $key => $value){
update_post_meta(76, $value, 'Steve');
}
Функции acf() и pods() дают вам точный meta key для этого типа записи. Если вы скопируете и вставите код, он может не работать.
Надеюсь, этот ответ поможет вам и другим.
Дайте мне знать, если у вас возникнут проблемы.
