Почему wp_update_post() не обновляет поле post_status?

8 окт. 2012 г., 03:50:23
Просмотры: 18.7K
Голосов: 6

Я использую этот код для добавления/обновления пользовательского типа записи с фронтенда. Дата устанавливается из кастомного jQuery datepicker.

    if (strtotime($date) < strtotime('tomorrow')) {
            $newpostdata['post_status'] = 'publish';
    } elseif (strtotime($date) > strtotime('today')) {
            $newpostdata['post_status'] = 'future';
            $newpostdata['post_date'] = date('Y-m-d H:i:s', strtotime($date));
    }

    if ('insert' == $operation) {
        $err = wp_insert_post($newpostdata, true);
    } elseif ('edit' == $operation) {
        $newpostdata['ID'] = $post_id;
        $err = wp_update_post($newpostdata);
    }

Это работает при первой публикации поста, правильно устанавливая статус как publish или future, с корректной датой.

Это не работает при редактировании того же поста - ни при смене с publish на future, ни в обратную сторону. Все остальные поля обновляются правильно, кроме статуса поста/будущей даты.

ОБНОВЛЕНИЕ 9 октября Я начинаю думать, что это может быть баг, поэтому я начал обсуждение в рассылке wp-hackers. По ссылке есть результаты тестов на свежей установке.


ДРУГИЕ НЕУДАЧНЫЕ ПОПЫТКИ:

Я пробовал оставить решение о post_status на усмотрение wp_insert_post(), используя:

elseif ('edit' == $operation) {
        $newpostdata['post_status'] = '';
        $newpostdata['ID'] = $post_id;
        $err = wp_update_post($newpostdata);
    }

Это устанавливает статус поста в draft, сохраняя при этом запрошенные даты.

Я также пробовал вызвать wp_transition_post_status() снова (эта функция вызывается один раз внутри wp_insert_post()):

elseif ('edit' == $operation) {
        $newpostdata['ID'] = $post_id;
        $err = wp_update_post($newpostdata);
        wp_transition_post_status($old_status, $status, $post_id);
    }

но это тоже не сработало.

У меня заканчиваются идеи. Есть какие-нибудь подсказки?

9
Комментарии

Я запутался. При редактировании записи и установке статуса "на будущее", дата записи не обновляется?

westondeboer westondeboer
8 окт. 2012 г. 05:03:18

Дата записи обновляется, но статус записи — нет. То есть если я публикую запись сегодня, а затем устанавливаю статус future с датой через три дня, дата изменяется, но post_status остается publish вместо future.

moraleida moraleida
8 окт. 2012 г. 05:26:57

Ладно, вот что выяснилось: если удалить post_status перед обновлением записи, она возвращается в статус draft, но по-прежнему отображается в админ-панели как запланированная. То есть это работает, но вопрос, почему нельзя вернуть статус future, остается открытым.

moraleida moraleida
8 окт. 2012 г. 05:33:01

Вы выполняете это как авторизованный пользователь с достаточными правами? Функции работы с данными обычно проверяют, разрешено ли пользователю выполнять эти действия.

Rarst Rarst
9 окт. 2012 г. 04:03:03

Да, я делаю это как сетевой администратор, а также как пользователь с "кастомной" ролью.

moraleida moraleida
9 окт. 2012 г. 04:19:53

Эй, Moraleida, ты забыл закрыть дело и здесь ;)

brasofilo brasofilo
27 нояб. 2012 г. 06:12:56

Ты прав, брат @brasofilo. Я скоро опубликую это здесь. :)

moraleida moraleida
27 нояб. 2012 г. 17:33:42

И если можно предложить: приведи вопрос в порядок, чтобы вопрос и ответ шли сразу к сути. Saudações!

brasofilo brasofilo
27 нояб. 2012 г. 18:24:37

У меня была похожая проблема, и её причиной было то, что параметр post_status был длиннее 20 символов. https://codex.wordpress.org/Post_Status Надеюсь, это поможет!

adrianthedev adrianthedev
18 мая 2017 г. 20:57:03
Показать остальные 4 комментариев
Все ответы на вопрос 6
0
12

Ответ не мог быть проще.

Как указал Отто в списке рассылки wp-hackers, проблема была в том, что я не устанавливал post_date_gmt при использовании wp_update_post().

Итоговый код выглядит так:

if ( $post_date < strtotime( "tomorrow" ) ) {
        $status = 'publish';    
        $newpostdata['post_status'] = $status;
        $newpostdata['post_date'] = date( 'Y-m-d H:i:s',  $post_date );

        // Также передаем 'post_date_gmt', чтобы WordPress корректно работал с датами
        $newpostdata['post_date_gmt'] = gmdate( 'Y-m-d H:i:s', $post_date );

    } elseif ( $post_date > strtotime( 'today' ) ) {
        $status = 'future';    
        $newpostdata['post_status'] = $status;
        $newpostdata['post_date'] = date( 'Y-m-d H:i:s', $post_date );

        // Также передаем 'post_date_gmt', чтобы WordPress корректно работал с датами
        $newpostdata['post_date_gmt'] = gmdate( 'Y-m-d H:i:s', $post_date );
    }

    if ('insert' == $operation) {
        $err = wp_insert_post($newpostdata, true);
    } elseif ('edit' == $operation) {
        $newpostdata['ID'] = $post_id;
        $err = wp_update_post($newpostdata);
    }
20 дек. 2012 г. 15:54:33
1

Я также пробовал приведенный выше код с использованием wp_update_post(), но он плохо работает в WordPress 3.9 — делает post_status пустым и удаляет все произвольные поля. Поэтому я создал собственный запрос, используя класс wpdb. Надеюсь, это сработает и для вас:

$wpdb->query( 
    $wpdb->prepare( 
        "UPDATE $wpdb->posts SET post_status = 'draft' WHERE ID = %d", 
        $post_id 
    )
);    

Этот вариант отлично сработал как на локальном сервере, так и на хостинге.

10 дек. 2014 г. 19:03:43
Комментарии

Добро пожаловать на [wordpress.se]. Надеюсь, вы не против изменений. Я исправил prepare-запрос.

birgire birgire
10 дек. 2014 г. 19:25:58
0

Мы постоянно обновляем статус записей, вот пример того, как мы позволяем пользователям (во фронтенд-редакторе, который был создан) "приостанавливать" объявления, переводя их в черновики:

if ($action == 'pause') {
        $my_post = array();
        $my_post['ID'] = $aid;
        $my_post['post_status'] = 'draft';
        wp_update_post($my_post);
        $action_msg = __('Объявление приостановлено', 'mytheme');
}
6 дек. 2012 г. 19:31:11
0

$newpostdata['post_date'] = date( 'Y-m-d H:i:s', $post_date );

Это вернет начальную дату PHP (1970 год), используйте strtotime для преобразования строки во время

$newpostdata['post_date'] = date( 'Y-m-d H:i:s', strtotime($post_date) );

31 дек. 2014 г. 12:53:35
0

Вам необходимо добавить "edit_date" => true в массив wp_update_post

27 окт. 2019 г. 21:16:00
0

Не проблема автора исходного сообщения, но важное замечание для тех, кто приходит сюда в поисках решения похожей проблемы, когда wp_update_post() не обновляет post_status...

Как отметил @adrianthedev выше в комментарии к исходному сообщению, обратите внимание, что максимальная длина пользовательского статуса записи составляет 20 символов.

https://developer.wordpress.org/reference/functions/register_post_status/#comment-3927

При превышении 20 символов вы можете зарегистрировать пользовательский статус записи с помощью register_post_status(), но на данный момент (по крайней мере, в WordPress версии 5.5.1) вы не сможете установить этот статус для записи с помощью wp_update_post().

7 сент. 2020 г. 22:18:09