Я хотел бы добавить поле метаданных к текущему сообщению на основе флажка в пользовательском мета-поле, чтобы иметь возможность переключать мой пользовательский плагин для каждого сообщения.
Для этого я закодировал следующие вещи
- создать метабокс на новом посте и странице новой страницы
- обрабатывать значение флажка в мета-поле и соответствующим образом устанавливать метаданные поста или страницы
Я преуспел в 1. но у меня проблемы с номером 2. У меня есть следующий код для обработки настройки метаданных:
Обновлять метаданные в зависимости от значения флажка в метабоксе
// register action
add_action( 'save_post', 'cl_save_postdata');
/* When the post is saved, saves our custom data */
function cl_save_postdata( $post_id ) {
// check if $post_id is just a revision id and if so get the parent id
if($parent_id = wp_is_post_revision($post_id)){
$post_id = $parent_id;
}
// verify this came from the our screen and with proper authorization,
// because save_post can be triggered at other times
if ( !wp_verify_nonce( EMU2_I18N_DOMAIN, plugin_basename(__FILE__) ) )
return $post_id;
// verify if this is an auto save routine.
// If it is our form has not been submitted, so we dont want to do anything
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
return $post_id;
// Check permissions
if ( 'page' == $_POST['post_type'] ) {
if ( !current_user_can( 'edit_page', $post_id ) )
return $post_id;
} else {
if ( !current_user_can( 'edit_post', $post_id ) )
return $post_id;
}
// OK, we're authenticated: we need to find and save the data
if ($_POST['cl-activated']) {
add_post_meta( $post_id, 'cl-activated', true, true) or update_post_meta( $post_id, 'cl-activated', true);
} elseif (get_post_meta ($post_id, 'cl-activated', true)) {
delete_post_meta( $post_id, 'cl-activated');
}
return $cl_is_activated;
}
Идея этого кода состоит в том, чтобы установить или отключить метаданные «cl-activated» в зависимости от значения флажка. Форма метабокса следующая:
Создать внутренний метабокс HTML
function cl_generate_inner_box($post, $metabox) {
// Use nonce for verification
wp_nonce_field( plugin_basename(__FILE__), EMU2_I18N_DOMAIN );
// The actual fields for data entry
echo '<label for="cl-activated">';
_e("Activate collect links", EMU2_I18N_DOMAIN );
echo '</label> ';
echo '<input type="checkbox" id="cl-activated" name="cl-activated" value='.$metabox['args']['cl-parameter-name'];
if (get_post_meta($post_id, 'cl-activated', true)==true) {
echo ' checked="checked"';
}
echo ' />';
}
Мои проблемы
- метаданные поста не заданы. Я попытался найти метаданные в таблице wp-postmeta в базе данных, но их там нет, что бы я ни делал.
- Есть ли способ сохранить метаданные, даже если сообщение или страница все еще являются черновиком, а пользователь только нажимает «Сохранить черновик»? Если я использую действие
save_post
, как сейчас, у меня создается впечатление, что оно вызывается только тогда, когда пост уже опубликован.
Редактировать
Первая проблема решена. Я дважды проверил хуки перехода, которые предоставляет WordPress. Мне казалось, что save_post
хук должен срабатывать, когда я редактирую пост. Однако происходит то, что он вызывается, когда я нажимаю кнопку нового сообщения, но не тогда, когда я затем сохраняю сообщение как черновик.
Чтобы очистить, мне нужен хук, который позволяет мне выполнять функцию, когда пользователь что-либо изменил в сообщении, чтобы увидеть, был ли изменен мой пользовательский флажок, чтобы я мог соответствующим образом обновить метаданные сообщения.
После WP 2.3 у вас для всех статусов есть крючок:
{$new_status}_{$post->post_type}
В качестве альтернативы вы можете использовать ans if для статуса на хуке save_post; пример для сообщения post_type, вы можете изменить этот «сообщение» на свой post_type или форму по умолчанию WP:
Я надеюсь, это поможет вам.
Честно говоря, я не понимаю вашей функции. Почему установка статуса сообщения на частный поможет мне решить мою проблему с обновлением метаданных моего сообщения, если вы только сохраняете черновик, обновляете или публикуете сообщение?
это только пример, вы также можете установить другой статус, например черновик
Я думаю, что здесь есть недоразумение: я не хочу менять статус сообщения. Я хочу, чтобы крючок был доступен, если создается новое сообщение (пользователь нажал «Новое сообщение»), и крючок, когда сообщение публикуется или сохраняется как черновик, чтобы записать значение параметра в метаданные сообщения.