Скажем, я хочу, чтобы у каждого сообщения был статус черновика, поэтому я использую приведенный ниже код.

<?php
add_action('save_post', 'mytheme_save_post');
function mytheme_save_post($post_id) {
remove_action('save_post','mytheme_save_post');

wp_update_post( array("ID"=>$post_id, "post_status"=>'draft'));

 add_action("save_post","mytheme_save_post");
}

Я знаю, что wp_update_post() сам запускает хук save_post, поэтому, чтобы избежать бесконечного цикла, мы должны использовать remove_action('save_post','mytheme_save_post') перед использованием этой функции. Мой вопрос в том, почему мне нужно повторно подключать функцию обратного вызова, когда я уже сделал это. Без перехвата не работает.

1
Mirajul Momin 15 Мар 2021 в 12:25

1 ответ

Лучший ответ

Сначала это может сбивать с толку, но, как вы сказали, необходимо избегать бесконечных циклов.

Если вы вызываете такую ​​функцию, как wp_update_post, которая включает ловушку save_post, ваша перехваченная функция создаст бесконечный цикл. Чтобы этого избежать, отключите функцию перед вызовом нужной функции, а затем повторно подключите ее.

add_action позволяет привязать функцию к определенному действию, здесь init.

Срабатывает после завершения загрузки WordPress, но до отправки заголовков.

add_action сам по себе ничего не запускает. Используя remove_action, вы фактически "вытягиваете" действие за пределы из последовательности запуска Wordpress, поэтому она не работает, если вы не повторно зацепить это.

Грубо говоря, это похоже на размещение файла в папке: если файла там нет, когда вы пытаетесь получить к нему доступ, вы получаете сообщение об ошибке или ваш запрос игнорируется. за исключением здесь, он даже не знает о его существовании, прежде чем вы его повторно подключите. Если вы не подключаете его повторно, вы в значительной степени просто объявляете функцию без порядка запуска.

Вы можете посмотреть краткую версию последовательности запуска Wordpress здесь.

1
amarinediary 15 Мар 2021 в 10:13