• Здравствуйте. Помогите пожалуйста, уже не знаю где еще можно спросить, никто не знает ответа на вопрос.
    Суть такая — имеется следующий код, размещенный в functions.php

    function get_random_worker( $new_status, $old_status, $post ) {
    	if ($new_status == 'publish' && $old_status == 'draft') {
    		global $wpdb;
        	$id_task = $post->ID;
        	$get_rand_worker = array("13", "14", "15");
        	$get_rand_worker_1 = array_rand($get_rand_worker, 1);
        	$rand_worker = $get_rand_worker[$get_rand_worker_1];
        	$wpdb->update( 'wp_postmeta',
    			array( 'meta_value' => $rand_worker ),
    			array( 'post_id' => $id_task, 'meta_key' => 'task_worker' )
    		);
    	}
    }
    add_action(  'transition_post_status',  'get_random_worker', 10, 3 );

    Этот код меняет значение мета-поля task_worker рандомом на одно из указанных при публикации записи, находящейся в статусе draft.
    Странность вот в чем — код прекрасно работает, если публикация происходит со страницы со всеми записями, т.е. захожу в Свойства -> выбираю статус Опубликовано и нажимаю Обновить.
    Если же я нахожусь внутри самой записи и нажимаю кнопку Опубликовать, то этот код не срабатывает. Помогите пожалуйста советом как это исправить, можно конечно каждый раз выходить из записи и публиковать со страницы со списком записей, но это неудобно.

Просмотр 7 ответов — с 1 по 7 (всего 7)
  • …Если же я нахожусь внутри самой записи и нажимаю кнопку Опубликовать…

    Вы уверены, что когда вы это делаете, что Запись имеет Статус «Черновик»

    Да

    Слышала, что хук ‘transition_post_status’ не срабатывал в Гутенберге, но работает в классическом редакторе. Не проверяла.

    Как раз у меня Classic Editor стоит.

    Слышала, что …

    вообще, странно слышать подобное на подобном Форуме.

    Тем не менее.
    в вашем примере бросается в глаза неаккуратная конструкция, собранная из кусочков по всей видимости из разных мест.
    Предлагаю ее удалить.
    Используйте стандартные функции update_post_meta( $post_id, $meta_key, $meta_value, $prev_value );

    Вот рабочий вариант:

    function get_random_worker( $new_status, $old_status, $post ) {
    	if ($new_status == 'publish' && $old_status == 'draft') {
        	$id_task = $post->ID;
        	$get_rand_worker = array("13", "14", "15");
        	$get_rand_worker_1 = array_rand($get_rand_worker, 1);
        	$rand_worker = $get_rand_worker[$get_rand_worker_1];	
    
    		update_post_meta( $id_task, 'task_worker', $rand_worker);
    	}
    }
    add_action(  'transition_post_status',  'get_random_worker', 10, 3 );

    вообще, странно слышать подобное на подобном Форуме

    Я не стала ссылаться на чужие утверждения, потому что не проверяла их. Но вы можете проверить, если хотите. ТС’у это не нужно, раз у него не гутенберг
    https://wordpress.org/support/topic/transition_post_status-action-hook-not-working/#post-12086271

    https://github.com/WordPress/gutenberg/issues/18201

    • Ответ изменён 4 года, 11 месяцев назад пользователем kword.
    Модератор Sergey Biryukov

    (@sergeybiryukov)

    Live and Learn

    Вы уверены, что когда вы это делаете, что Запись имеет Статус «Черновик»

    Да

    Стоит перепроверить в базе или вывести значения $new_status и $old_status при воспроизведении проблемы.

    На практике вместо draft там может быть, например, auto-draft, в этом случае ваше условие не выполнится.

Просмотр 7 ответов — с 1 по 7 (всего 7)
  • Тема «Не работает код из functions.php. Очень странно.» закрыта для новых ответов.