Произвольные поля в WordPress. Руководство по добавлению и выводу

произвольные поля wordpress

Сегодня мы поговорим об одной из возможностей популярной CMS, это произвольные поля в WordPress. Где это может нам пригодиться?

При создании нового поста в WP,  страница добавления, содержит только редактор и поле для заголовка.

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

Как раз недавно мы добавляли поля к постам: автор, редактор, источник.

Для начала нам нужно добавить мета бокс, на страницу редактирования и добавления поста. Код можно писать в файле темы function.php, а лучше добавить в самоактивируемый плагин.

/* Добавляем блоки в основную колонку на страницах постов */

function info_post_box() {
    add_meta_box('info_post_id', 'Информация о посте', '', 'post');
}

add_action('add_meta_boxes', 'info_post_box');

Дальше опишем функцию info_post_box_callback, она будет выводить наши произвольные поля.

global $custom_meta_fields;

$custom_meta_fields = array(
    array(
        'label' => "Автор",
        'desc' => "Автор оригинальной статьи",
        'id' => 'origin_author',
        'type' => 'input'
    ),
    array(
        'label' => "Редактор",
        'desc' => "Редактор или преводчик статьи",
        'id' => 'translator',
        'type' => 'input'
    ),
    array(
        'label' => "Ссылка",
        'desc' => "Ссылка на оригинальный текст статьи",
        'id' => 'link_article',
        'type' => 'input'
    )
);

function info_post_box_callback() {
    global $post;
    global $custom_meta_fields;

    // Use nonce for verification
    echo '';

    // Begin the field table and loop

    foreach ($custom_meta_fields as $field) { // get value of this field if it exists for this post 
       $meta = get_post_meta($post->ID, $field['id'], true); // begin a table row with 

       echo ''; 
       switch ($field['type']) { 
         case 'input': echo '' . $field['desc'] . ''; 
       break; 
       } //end switch 
       echo '
        
'; } // end foreach }

Что бы сохранить информацию напишем функцию save_custom_meta которую повесим на action('save_post');

add_action('save_post', 'save_custom_meta');

/**
 * Save the meta field when the post is saved.
 */
function save_custom_meta($post_id) {
    global $custom_meta_fields;
    if (iam_user_can_save($post_id, 'iam_nonce_check_value')) {
        foreach ($custom_meta_fields as $field) {
            // Checks for input and sanitizes/saves if needed
            if (isset($_POST[$field['id']]) && 0 < count(strlen(trim($_POST[$field['id']])))) {
                update_post_meta($post_id, $field['id'], sanitize_text_field($_POST[$field['id']]));
            }
        }
    }
}

С помощью функции iam_user_can_save проверяем может ли пользователь сохранять и редактировать посты.

/**
 * Determines whether or not the current user has the ability to save meta 
 * data associated with this post.
 *
 * @param       int     $post_id    The ID of the post being save
 * @param       bool                Whether or not the user has the ability to save this post.
 */
function iam_user_can_save($post_id, $nonce) {

    // Checks save status
    $is_autosave = wp_is_post_autosave($post_id);
    $is_revision = wp_is_post_revision($post_id);
    $is_valid_nonce = ( isset($_POST[$nonce]) && wp_verify_nonce($_POST[$nonce], 'iam_nonce_check') ) ? 'true' : 'false';

    // Return true if the user is able to save; otherwise, false.
    if ($is_autosave || $is_revision || !$is_valid_nonce) {
        return false;
    }
    return true;
}

Далее нам нужно вывести произвольные поля в теме Worpress, это можно сделать с помощью стандартной функции get_post_meta(). Добавьте следующий код в том месте где вам нужно вывести поля, в нашем случае файл шаблона single.php

< ?php $meta = get_post_meta($post->ID); ?>
Автор: < ?php echo $meta['origin_author'][0]; ?>
Редактор: < ?php echo $meta['translator'][0]; ?>
Источник: оригинал статьи

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>