PostMeta

07.03.2016

882


Deprecated: Function create_function() is deprecated in /home/htvtwmhs/public_html/wp-content/plugins/wp-spamshield/wp-spamshield.php on line 2033

PostMeta — это функционал произвольных полей. В данной статье будет рассматриваться тема использования PostMeta без плагина Advanced Custom Fields.

Включаем в интерфейсе настроек записи Произвольные поля. В поле имя вписываем название поля (!только латинские и желательно одним словом), в значение вписываем содержимое поля. Если в одном поле несколько значений, нужно создавать несколько полей с одним и тем же полем, но разными значениями.

Данный стандартный функционал сильно уступает плагину Advanced Custom Fields. Целеснообразнее использовать его.

Пользовательские типы записей

Включение произвольных полей в пользовательских типах записей. track — это название произвольного типа записей.

// Произвольные поля для пользовательского типа записей

function true_custom_fields() {
	add_post_type_support( 'track', 'custom-fields'); // в качестве первого параметра укажите название типа поста
}
 
add_action('init', 'true_custom_fields');

Вывод данных

Вывести все метаданные записи

<?php the_meta(); ?>

Вывести конкретное поле (если значение единственное)

<?php echo get_post_meta($post->ID, 'film', true); ?>

Вывести конкретное поле (если значений несколько)

<?php $items = get_post_meta($post->ID, 'film', false); ?>

<?php foreach ( $items as $item) {
echo "<p>$item</p>";
} ?>

Вывести поле с данными содержащими тэги html (например если поле заполняется в редакторе wysiwyg)

<?php print htmlspecialchars_decode(get_post_meta($post->ID, 'tehparam', true)); ?>

Вывести поле с проверкой: заполнено ли метаполе. Это нужно, чтобы не выводить в верстке пустые тэги, при незаполненном поле.

<?php if(get_post_meta($post->ID, 'film', true)): ?>
<?php echo get_post_meta($post->ID, 'film', true); ?>
<?php endif; ?>

Вывод списка метаполей для произвольных типов записей

Создаем функцию

function generate_meta_keys(){
    global $wpdb;
    $post_type = 'shop_order';
    $query = "
        SELECT DISTINCT($wpdb->postmeta.meta_key) 
        FROM $wpdb->posts 
        LEFT JOIN $wpdb->postmeta 
        ON $wpdb->posts.ID = $wpdb->postmeta.post_id 
        WHERE $wpdb->posts.post_type = '%s' 
        AND $wpdb->postmeta.meta_key != '' 
        AND $wpdb->postmeta.meta_key NOT RegExp '(^[_0-9].+$)' 
        AND $wpdb->postmeta.meta_key NOT RegExp '(^[0-9]+$)'
    ";
    $meta_keys = $wpdb->get_col($wpdb->prepare($query, $post_type));
    return $meta_keys;
}

Выводим метаполя custom_post. Нужно понимать что выведутся все метаполя, а не поля текущей записи произвольного типа.

echo '<pre>';
print_r (generate_meta_keys()); 
echo '</pre>';

Альтернативный способ вывода метаполей

Данный способ может примется к любым метаполям, но он будет выдавать только первый результат, т.е. для полей с несколькими значения не подходит. Идеально для ситуаций, когда требуется выводить несколько полей.

В цикле вывода записи добавляем следующий вызов (код позаимствовал на сайте wp-kama.ru):

$meta = new stdClass;
foreach( (array) get_post_meta( $post->ID ) as $k => $v ) $meta->$k = $v[0];

Теперь любое метаполе можно вывести по слагу так:

echo $meta->book;

Тоже решение, но с другим (более понятным) синтаксисом:

$current_post_meta = get_post_meta($post_id);
foreach ($current_post_meta as $meta_key => $meta_value) {
      $current_post_meta[$meta_key] = $meta_value[0];
}

Выводиться так:

echo $current_post_meta['aname'];

Есть один недостаток, если при выводе в цикле у какой-либо записи не будет данного поля то последует предупреждение Undefined index: aname in. Чтобы этого избежать можно делать такой вывод:

echo @$current_post_meta['aname'];

@ — символ экранирования подобных предупреждений.

Проверка пустое поле или нет:

<?php if (empty($current_post_meta['aname'])) {
echo 'пустое';
} else {
echo 'не пустое';
} ?>

Поделится информацией с друзьями

  • Комментарии
  • Вложения

Добавить комментарий

Пока нет комментариев. Будь первым!

PostMeta
Изменение объекта при скроллинге
Рекомендации для васИзменение объекта при скроллингеOpttour.ru
Спасибо! Наш менеджер свяжется с Вами в течении 5 минут.