add_action на унаследованный статус записи

Вопрос или проблема

Я пытаюсь использовать хук 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 — это правильное направление. Этот хук позволяет перехватывать любое изменение статуса записи и уже на его основе выполнять необходимую проверку передачи между состояниями.

Шаги к решению

  1. Использование правильного хука

    Основная идея — сфокусироваться на хуке 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.

  2. Убедитесь, что функция вызывается для нужных условий

    В коде вы проверяете, что старый статус поста — это "pending" (ожидание), а новый — "publish" (опубликован), и применяется это только для типа поста portfolio.

  3. Объединение с другими статусами

    Вы можете добавить проверку для других состояний, если ваш процесс предполагает несколько путей изменения статусов. Например:

    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.

Если у вас появятся дополнительные вопросы или потребуется помощь с другой функциональностью, не стесняйтесь обращаться за поддержкой. Успехов в разработке!

Оцените материал
Добавить комментарий

Капча загружается...