Сегодня мы поговорим об одной из возможностей популярной 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 '
Что бы сохранить информацию напишем функцию 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
comments powered by HyperComments