Я пытаюсь настроить пользовательский тип записи, следуя этот учебник . Тем не менее, я немного смущен тем, как/где реализовать update_post_meta()
. Учебник предлагает этот шаблон:
add_action('save_post', 'save_my_metadata');
function save_my_metadata()
{
global $post;
update_post_meta($post->ID, 'my_metadata', $_POST['my_metadata']);
}
Который работает, но имеет неприятный эффект от добавления этих метаданных к каждому посту, независимо от того, принадлежит он к этому пользовательскому типу или нет.
Я поместил выше в functions.php
и думаю, что это может быть частью проблемы. Я предполагаю, что мне нужно ограничить действие "save_post", чтобы срабатывать только для сообщений моего пользовательского типа.
function save_my_metadata($ID = false, $post = false)
{
if($post->post_type != 'your_post_type')
return;
update_post_meta($ID, 'my_metadata', $_POST['my_metadata']);
}
Это должно работать. Просто замените "ваш_пост_тип" на название типа поста. Кроме того, малоизвестный факт: хук 'save_post' передает идентификатор сообщения в качестве аргумента.
Правка
Я обновил функцию, чтобы отразить комментарий Яна. Спасибо, Ян!
Если вы хотите обрабатывать несколько типов записей, я бы порекомендовал базовый оператор switch:
add_action('save_post', 'save_my_metadata');
function save_my_metadata($ID = false, $post = false)
{
switch($post->post_type)
{
case 'post_type_1':
// Do stuff for post type 1
update_post_meta($ID, 'my_metadata', $_POST['my_metadata']); // Example...
break;
case 'post_type_2':
// Do stuff for post type 2
break;
default:
return;
}
}
Случаи в основном такие же, как if($post->post_type) == 'post_type_1') {}
, но не требуют нескольких блоков if-else. Блок default
в переключателе обрабатывает случаи, когда тип записи не указан в вашем пользовательском наборе.
@John P Bloch и @EAMann уже дали отличные ответы, так что мой в дополнение:
функция save_my_metadata ($ post_id, $ post = false) { if ($ post-> post_type == 'your_post_type') update_post_meta ($ post_id, '_my_metadata', $ _POST ['my_metadata' ]);.. }Очевидно, это означает, что вам понадобится пользовательский метабокс, чтобы иметь возможность редактировать поля тоже. Вот экран редактирования для контекста:
save_{$post_type}_post
"; для типа сообщения movie
это будет save_movie_post
. Вот что вам нужно добавить в файл functions.php
вашей темы или где-нибудь в плагин:add_action ('save_post', 'save_custom_post_type_posts', 10,2); функция save_custom_post_type_posts ($ post_id, $ post = false) { do_action ("save _ {$ post- > post_type} _POST "); [. .____]} [. .____]Теперь вы можете переписать свой исходный код следующим образом (включая трюк с подчеркиванием из # 1 выше):
add_action ('save_my_postype_post', 'save_my_postype_metadata', 10,2); функция save_my_postype_metadata ($ post_id, $ post) { update_post_meta ($ post_id, '_my_metadata', $ _POST [ 'my_metadata']); }
Лично я предпочитаю следовать шаблону ниже для добавления пользовательских мета-обработчиков к типам записей. Ниже вы можете добавить мета-поддержку к типу поста, просто добавив ключ support ('subtitle' в примере ниже) в массив support для типа поста, вызвав add_post_type_support ('my_post_type', 'subtitle');
class Subtitle_Meta_Handler {
public function initialize() {
add_action('add_meta_boxes', array($this, 'add_metabox'), 10, 2);
add_action('save_post', array($this, 'update'));
}
public function add_metabox($post_type, $post)
{
if(post_type_supports($post_type, 'subtitle'))
{
add_meta_box('subtitle', 'Subtitle', array($this, 'metabox'), $post_type);
}
}
public function metabox($post)
{
$subtitle = get_post_meta($post->ID, 'subtitle', true);
if(!$subtitle)
{
$subtitle = '';
}
?>
<input type="text" style="width: 70%;" value="<?php echo esc_attr($subtitle);?>" name="subtitle" id="subtitle">
<?php
wp_nonce_field('update_subtitle', 'subtitle_nonce');
}
public function update($post_id)
{
if(wp_is_post_autosave($post_id) || wp_is_post_revision($post_id)) {
return $post_id;
}
if(isset($_REQUEST['subtitle_nonce']) && wp_verify_nonce($_REQUEST['subtitle_nonce'], 'update_subtitle')) {
$subtitle = trim(strip_tags($_REQUEST['subtitle'], '<b><strong><span><a>'));
if(empty($subtitle)) {
delete_post_meta($post_id, 'subtitle');
} else {
update_post_meta($post_id, 'subtitle', $subtitle);
}
}
}
}
add_action('init', array(new Subtitle_Meta_Handler(), 'initialize'));
Надеюсь, что-то подобное скоро будет добавлено в ядро.
Я не могу заставить это работать - не уверен, что я делаю неправильно - но я пытаюсь использовать хук post_updated вместо save_post - так как я хочу, чтобы эти значения были вставлены после обновления поста, чтобы я мог получить значения из других пользовательских полей ,.
function update_meta ($ID = false, $post = false) {
update_post_meta($ID, 'rest_long', 'Test 1');
update_post_meta($ID, 'rest_lat', 'Test 2');
}
add_action('post_updated', 'update_meta');
Перед обновлением проверьте, является ли текущее сообщение вашим типом сообщения. Это гарантирует, что вы не сохраните его для всех сообщений.
Вы также должны проверить ввод (это отсутствует в вашем примере) и, кроме того, имейте в виду, что вы можете добавлять действие только тогда, когда активен этот тип записи. Если это так, вам не нужно проверять этот тип сообщения позже.
Получение сообщений типа: get_post_type()
или $post->post_type;