Вопрос или проблема
Я пытаюсь использовать хук add_action() для запуска пользовательской функции, но у меня возникают трудности со статусом поста.
Изначально я пробовал использовать:
add_action('pending_to_publish_portfolio', 'my_function');
(портфолио – это мой пользовательский тип записи).
Это не сработало, поэтому я разместил вопрос на официальном форуме поддержки WordPress для получения помощи. Мне дали следующий код, чтобы получить правильный статус перехода:
function bj_test($new, $old) {
print_r($old . '_to_' . $new);
echo '<br>';
print_r($old . '_' . $new);
die();
}
add_action('transition_post_status', 'bj_test', 10, 2);
Это дает мне два статуса:
new_to_inherit new_inherit
Я посмотрел на статус inherit, и в кодексе просто указано, что он используется для ревизий постов. Это логично, так как я изменяю статус статьи с «ожидающей» на «опубликованную».
Моя проблема в том, что я не знаю, как использовать эту информацию. Все, что я пытаюсь сделать, это запустить событие, когда я изменяю статус поста с ожидающего на опубликованный. Согласно всем найденным мной онлайн-урокам, это должно быть так же просто, как и в моей первой попытке (см. выше), но это просто не работает. Не изменилось ли что-то недавно в том, как обрабатываются переходы постов, так что все эти уроки устарели?
Вероятно, это очень просто для кого-то, кто знает, что делает, но я очень новичок в WP и начинаю исчерпывать варианты 🙁
Любая помощь приветствуется.
Я сталкиваюсь с этой же проблемой в коде, который я разрабатываю.
В вашем случае, однако, tree – это лучший хук, так как вы хотите подключить только посты, которые переходят в статус ‘publish’
Вам нужно подключить вашу функцию ко всем возможным хукам {status}_to_publish следующим образом:
add_action('new_to_publish', 'my_function');
add_action('draft_to_publish', 'my_function');
add_action('auto-draft_to_publish', 'my_function');
add_action('pending_to_publish', 'my_function');
add_action('future_to_publish', 'my_function');
add_action('private_to_publish', 'my_function');
Вы также можете передать начальные статусы, используя цикл foreach с первой частью имен хуков из массива.
Ваш код почти готов. Минимальная версия будет следующей:
function bj_test($new, $old) {
if ('pending_to_publish' == $old . '_to_' . $new) {
// run your code
}
}
add_action('transition_post_status', 'bj_test', 10, 2);
Это будет работать для любого типа поста, но, похоже, вам нужно только для одного типа. Нет такого хука, как pending_to_publish_{cpt}
(по крайней мере, насколько мне известно), но есть хук {$new_status}_{$post->post_type}
, однако он сработает каждый раз при сохранении поста, а не только при изменении перехода. Также не совсем то, что нужно.
Но…
function run_cpt_action($a,$b) {
// run your code
var_dump($a,$b); die; // только отладка
}
function bj_test($new, $old) {
if ('pending_to_publish' == $old . '_to_' . $new) {
add_action('publish_book_type','run_cpt_action',1,2);
}
}
add_action('transition_post_status', 'bj_test', 10, 2);
… благодаря порядку, в котором срабатывают фильтры, вы можете объединить оба и сделать так, чтобы это работало.
Ответ или решение
Ваша задача состоит в том, чтобы правильно использовать хуки WordPress для выполнения функции при изменении статуса записи с "Ожидания" на "Опубликованный". Давайте рассмотрим более детально, как можно это реализовать.
Понимание проблематики
Вы упомянули, что сталкиваетесь с проблемой использования хука add_action()
в контексте изменения статуса поста. Использование специфических хуков, как, например, pending_to_publish_portfolio
, действительно может не сработать из-за особенностей обработки состояний в WordPress. Это связано с тем, что такие хуки заданы для общего использования и могут не охватывать специфичные типы постов или пользовательские статусы.
Решение проблемы
Использование общего хука transition_post_status
— это правильное направление. Этот хук позволяет перехватывать любое изменение статуса записи и уже на его основе выполнять необходимую проверку передачи между состояниями.
Шаги к решению
-
Использование правильного хука
Основная идея — сфокусироваться на хуке
transition_post_status
, который срабатывает при любом изменении статуса:function bj_test($new_status, $old_status, $post) { if ('pending' === $old_status && 'publish' === $new_status && 'portfolio' === $post->post_type) { // Запустите вашу функцию здесь my_function($post); } } add_action('transition_post_status', 'bj_test', 10, 3);
В этой функции добавлен третий параметр
$post
, который позволяет применить условную проверку на ваш пользовательский тип постаportfolio
. -
Убедитесь, что функция вызывается для нужных условий
В коде вы проверяете, что старый статус поста — это "pending" (ожидание), а новый — "publish" (опубликован), и применяется это только для типа поста
portfolio
. -
Объединение с другими статусами
Вы можете добавить проверку для других состояний, если ваш процесс предполагает несколько путей изменения статусов. Например:
function bj_test($new_status, $old_status, $post) { if ($post->post_type === 'portfolio') { $allowed_transitions = [ 'pending' => 'publish', 'draft' => 'publish', // Добавьте другие переходы, если необходимо ]; if (isset($allowed_transitions[$old_status]) && $allowed_transitions[$old_status] === $new_status) { // Выполните код my_function($post); } } } add_action('transition_post_status', 'bj_test', 10, 3);
Этот подход позволит убедиться, что ваша функция выполняется только при соблюдении всех условий, что значительно сократит ненужные вызовы скрипта.
Заключение
Имплементация данного решения требует понимания последовательности событий в WordPress, что обеспечивает более надежную и гибкую работу с пользовательскими типами и статусами постов. Надеюсь, данное руководство поможет вам эффективно решать задачи, связанные с переходом статусов в WordPress.
Если у вас появятся дополнительные вопросы или потребуется помощь с другой функциональностью, не стесняйтесь обращаться за поддержкой. Успехов в разработке!