
Сегодня мы поговорим об одной из возможностей популярной 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 '
‘ . $field[‘label’] . ‘ ‘; } // 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
