Как получить все произвольные поля любого типа записи

17 мар. 2017 г., 13:35:31
Просмотры: 19.9K
Голосов: 8

У меня есть несколько типов записей. Я хочу получить все произвольные поля, связанные с этим типом записи.

Пример:

Запись
-- изображение
-- Избранное изображение
-- содержимое

Мне нужно получить все поля или произвольные поля в массиве. Я нашел решение отсюда, но оно не соответствует моим целям:

    echo '<pre>';
    print_r(get_post_custom($post_id));
    echo '</pre>';
8
Комментарии

Мне нужны все поля с типом записи. Это может быть изображение записи, основной текст, произвольные поля. Не для поста. :)

Например: array( 'post_type'=>array('image,body,title,featured_image')) Тип записи может быть страницей, постом или чем угодно.

Надеюсь, теперь понятно.

user115277 user115277
17 мар. 2017 г. 17:43:16

У вас есть кусок кода, снова? Кусок, чтобы показать нам. Здесь никто не будет писать код за вас.

Max Yudin Max Yudin
17 мар. 2017 г. 19:17:31

Я ничего не кодирую. Мне нужна идея. Я не прошу никого писать код за меня. Я долго искал решения. Сейчас я ищу в ядре WordPress, как они извлекают поля вместе с другими произвольными полями в записи или странице. Если найду - отвечу здесь.

Спасибо

user115277 user115277
17 мар. 2017 г. 19:33:11

Пожалуйста, опубликуйте ваш код, чтобы можно было найти ошибки. В противном случае я удалю ваш пост, так как он не соответствует требованиям этого сайта.

Max Yudin Max Yudin
17 мар. 2017 г. 19:47:38

Хорошо, можете. Вы не в состоянии понять, что я хочу... :)

user115277 user115277
17 мар. 2017 г. 20:28:24

Вам следует уточнить ваш вопрос. Я думаю, вы хотите зарегистрированные произвольные поля и другие стандартные поля для пользовательского типа записи. Если это так, то это возможно. Если вы используете ACF, Pods или Types, я могу предложить решения. Потому что они сохраняют данные в базе данных, и вы можете легко получить значения с помощью запроса. Решение сложное, и если вы не знаете структуру WordPress, вы не сможете его реализовать.

Faysal Mahamud Faysal Mahamud
23 мар. 2017 г. 09:03:03

@user115277 дай мне знать, правильно ли я понял твой вопрос в своем ответе, и я отредактирую твой вопрос, чтобы устранить недопонимание

bosco bosco
25 мар. 2017 г. 05:50:43

спасибо, @bosco, оба решения мне очень помогли. Мне на самом деле нужны были все пользовательские поля, связанные с типом записи, используя Advanced Custom Fields (ACF).

user115277 user115277
25 мар. 2017 г. 10:56:06
Показать остальные 3 комментариев
Все ответы на вопрос 2
0

Возможности типов записей

Существует несколько способов получить список "возможностей", которые поддерживает определённый тип записи. Самый простой — использовать функцию 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-запрос для получения этой информации, что, без сомнения, будет значительно производительнее, чем запрос метаданных для каждой записи определённого типа.

25 мар. 2017 г. 05:38:40
0

Добавьте следующий код в 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 для этого типа записи. Если вы скопируете и вставите код, он может не работать.

Надеюсь, этот ответ поможет вам и другим.

Дайте мне знать, если у вас возникнут проблемы.

23 мар. 2017 г. 09:25:52