Вопрос или проблема
У меня есть простая функция, подключенная к transition_post_status
: она должна срабатывать только тогда, когда статус поста “опубликован”:
function on_publish($new_status, $old_status, $post)
{
// (...) пропущенный код
if (('draft' === $old_status || 'auto-draft' === $old_status) && $new_status === 'publish') {
// проблема здесь
$checkbox_value = get_post_meta($post->ID, '_custom_checkbox', true);
$textarea_value = get_post_meta($post->ID, '_custom_textarea', true);
}
}
add_action('transition_post_status', 'on_publish', 10, 3);
Затем у меня есть простой метабокс с флажком и текстовой областью. Мне нужны данные в моем transition_post_status
, но я не могу их получить.
Это код для метабокса.
add_action('add_meta_boxes', 'custom_metabox_add');
function custom_metabox_add() {
add_meta_box(
'custom_metabox',
'Пользовательские настройки',
'custom_metabox_callback',
'post',
'side',
'default'
);
}
function custom_metabox_callback($post) {
$checkbox_value = get_post_meta($post->ID, '_custom_checkbox', true);
$textarea_value = get_post_meta($post->ID, '_custom_textarea', true);
echo '<p>';
echo '<label for="custom_checkbox">';
echo '<input type="checkbox" id="custom_checkbox" name="custom_checkbox" value="1"' . checked(1, $checkbox_value, false) . ' />';
echo ' Включить';
echo '</label>';
echo '</p>';
echo '<p>';
echo '<label for="custom_textarea">Заметки:</label>';
echo '<textarea id="custom_textarea" name="custom_textarea" rows="5" style="width:100%;">' . esc_textarea($textarea_value) . '</textarea>';
echo '</p>';
wp_nonce_field('custom_metabox_nonce_action', 'custom_metabox_nonce');
}
add_action('save_post', 'custom_metabox_save');
function custom_metabox_save($post_id) {
if (!isset($_POST['custom_metabox_nonce']) || !wp_verify_nonce($_POST['custom_metabox_nonce'], 'custom_metabox_nonce_action')) {
return $post_id;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return $post_id;
}
if (!current_user_can('edit_post', $post_id)) {
return $post_id;
}
$checkbox_value = isset($_POST['custom_checkbox']) ? 1 : 0;
update_post_meta($post_id, '_custom_checkbox', $checkbox_value);
if (isset($_POST['custom_textarea'])) {
update_post_meta($post_id, '_custom_textarea', sanitize_text_field($_POST['custom_textarea']));
}
}
Что я могу сделать, чтобы значения были сохранены перед вызовом on_publish
?
Буду признателен за любую помощь.
Ответ или решение
Для решения вашей задачи по извлечению значений метаполей из пользовательского метабокса в функции, привязанной к хук transition_post_status
, важно убедиться, что метаполя сохраняются перед тем, как функция срабатывает. В вашем коде вы пытаетесь получить метаполя в момент публикации, но значения еще не сохранены, что вызывает проблему.
Вот подход, который поможет вам получить значения метаполей перед вызовом функции on_publish
:
1. Измените порядок вызова функций:
Вы можете воспользоваться хуком save_post
, который вызывается сразу после сохранения поста, чтобы обработать данные метаполей. Вместо того, чтобы пытаться извлечь значения в on_publish
, вам следует сохранить значения в глобальных переменных или в transient, чтобы потом получить их в on_publish
.
2. Реализация:
Вот как этот подход можно реализовать:
Шаг 1: Сохранение метаполей в глобальные переменные
В функции custom_metabox_save
, после того, как вы сохранили значения метаполей, вы можете использовать глобальные переменные или транзиенты для передачи этих данных в on_publish
.
add_action('save_post', 'custom_metabox_save');
function custom_metabox_save($post_id) {
// Проверка nonce и полномочий
if (!isset($_POST['custom_metabox_nonce']) || !wp_verify_nonce($_POST['custom_metabox_nonce'], 'custom_metabox_nonce_action')) {
return $post_id;
}
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
return $post_id;
}
if (!current_user_can('edit_post', $post_id)) {
return $post_id;
}
$checkbox_value = isset($_POST['custom_checkbox']) ? 1 : 0;
update_post_meta($post_id, '_custom_checkbox', $checkbox_value);
if (isset($_POST['custom_textarea'])) {
update_post_meta($post_id, '_custom_textarea', sanitize_text_field($_POST['custom_textarea']));
}
// Сохраняем данные в глобальных переменных
global $custom_meta_data;
$custom_meta_data = [
'checkbox' => $checkbox_value,
'textarea' => isset($_POST['custom_textarea']) ? sanitize_text_field($_POST['custom_textarea']) : ''
];
}
Шаг 2: Извлечение данных в функции on_publish
Теперь вы можете использовать сохраненные данные в функции on_publish
.
function on_publish($new_status, $old_status, $post) {
global $custom_meta_data;
if (('draft' === $old_status || 'auto-draft' === $old_status) && $new_status === 'publish') {
if (isset($custom_meta_data)) {
$checkbox_value = $custom_meta_data['checkbox'];
$textarea_value = $custom_meta_data['textarea'];
// Ваш код здесь
}
}
}
add_action('transition_post_status', 'on_publish', 10, 3);
Заключение
Таким образом, данный подход позволяет аккуратно сохранять и извлекать данные метаполей в нужный момент. Использование глобальных переменных представляет собой простой способ передачи данных между вызовами хуков. Обязательно протестируйте реализацию в своем окружении, чтобы убедиться, что все работает корректно и значения метаполей доступны в нужный момент.
Если у вас возникнут дополнительные вопросы по коду или другим аспектам разработки на WordPress, не стесняйтесь обращаться за поддержкой. Удачи в ваших начинаниях!