Добрый день) Сегодня мы поговорим об одной из возможности WordPress, это дополнительные поля. Где это может нам пригодиться?
При создании нового поста в WP, страница добавления, содержит только редактор и поле для заголовка.
Но очень часто нам нужно дополнять пост или страницу дополнительной информацией. Для этого нам и следует использовать произвольные поля. Сейчас мы разберем реальный пример, с нашего проекта.
Как раз недавно мы добавляли поля к постам:
- автор
- редактор
- источник
Для начала нам нужно добавить мета бокс, на страницу редактирования и добавления поста. Код можно писать в файле темы function.php, а лучше добавить в самоактивируемый плагин.
1
2
3
4
5
6
7
|
/* Добавляем блоки в основную колонку на страницах постов */
function info_post_box() {
add_meta_box('info_post_id', 'Информация о посте', '', 'post');
}
add_action('add_meta_boxes', 'info_post_box');
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
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 '<input name="custom_meta_box_nonce" type="hidden" value="' . wp_create_nonce(basename(__FILE__)) . '" />';
// 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 '<input id="' . $field['id'] . '" name="' . $field['id'] . '" type="text" value="' . $meta . '" /><span class="description">' . $field['desc'] . '</span>';
break;
} //end switch
echo '
<table class="form-table">
<tbody>
<tr>
<th><label for="' . $field['id'] . '">' . $field['label'] . '</label></th>
</tr>
</tbody>
</table>';
} // end foreach
}
|
Что бы сохранить информацию напишем функцию save_custom_meta которую повесим на action(‘save_post’);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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']]));
}
}
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/**
* 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;
}
|
1
2
3
4
5
|
<div class="info-post">< ?php $meta = get_post_meta($post->ID); ?>
<div class="origin_author">Автор:< ?php echo $meta['origin_author'][0]?></div>
<div class="translator">Редактор:< ?php echo $meta['translator'][0]?></div>
<div class="link_article">Источник:<a href="<?php echo $meta['link_article']?>">оригинал статьи</a></div>
</div>
|