curtismchale
  • 0
Профи

Как сделать публикацию черновиком, если она старше сегодняшнего дня

  • 0

В предыдущем вопросе мне нужно было установить будущую датированную публикацию (настраиваемый тип публикации) как опубликованную при сохранении, а не планировать ее.

В день, когда он «запланирован», я хотел бы снова установить его как черновик. Я пытался подключиться к init и обернуть его в if, проверяя тип сообщения. Я полагал, что оно будет сравниваться со временем сервера, а затем устанавливать статус черновика, если оно старше времени сервера.

В виде грубого наброска:

if custom post type
  get_the_time of post
  get the server time
  if post time is older than server time set status to draft
endif

Здесь и обновите код, с которым я работаю.

function sfn_show_expire(){
    global $wpdb;
    $server_time = date('mdy');
    $result = $wpdb->get_results("SELECT * FROM wp_posts WHERE post_type = 'show' AND post_status = 'publish'");
    if( !empty($result)) foreach ($result as $a){
        $show_time = get_the_time('mdy', $a->ID );
        if ( $server_time > $show_time){
            $my_post = array();
            $my_post['ID'] = $a->ID;
            $my_post['post_status'] = 'draft';
            wp_update_post( $my_post );
        }
    } // end foreach
}
add_action( 'init', 'sfn_show_expire' );

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

Share
  1. curtismchale, я бы посоветовал добавить к вашему сообщению четкий и определенный вопрос (а также сделать заголовок вопросом). Как бы то ни было, ваши намерения несколько ясны, но их можно сделать более ясными.

    • 0
    • Итак, вы хотите установить даты истечения срока действия для своего пользовательского типа сообщений, а не даты публикации? Я понимаю цель такой настройки… но я думаю, что вы слишком сильно зависите от стандартного времени публикации поста. Дайте мне еще немного времени подумать, но я думаю, вам лучше подойдет настраиваемое поле для тайм-аута видимости, чем прямая привязка к дате публикации сообщения.

      • 0
    • Я видел (и могу сделать) тайм-ауты на основе модифицированного цикла и настраиваемого поля. В пользовательском типе сообщений уже есть множество настраиваемых панелей и полей для записи (несколько музыкальных исполнителей, твиттер для исполнителя…), которые мы хотели бы больше не редактировать. Также установка даты дважды кажется немного избыточной.

      • 0
    • Я думаю, вам следует хранить даты истечения срока действия в пользовательских полях или мета-полях и добавить задание WP cron для очистки постов с истекшим сроком действия. Это оставит обычный поток WP нетронутым.

      • 0
    • Да, я задавался вопросом о хитах DB. Теперь, когда это работает, я могу поиграть с cron. Была еще одна проблема с моим кодом (сейчас исправлена). Я не передавал post_id в get_the_time, поэтому он просто захватывал каждое сообщение.

      • 0
    • @curtismchale, можно ли поделиться полным решением? У меня такой же вопрос, и я еще не нашел рабочего решения. Спасибо

      • 0
    • Может ли кто-нибудь сказать мне, что я ошибаюсь, и поэтому я получил отрицательный голос?

      • 0
    • Не могли бы вы объяснить, как объявление массива будет использовать избыточную память?

      • 0
  2. Ваш запрос не дает вам идентификатор сообщения, он дает вам сообщение целиком. SELECT * Возвращает все столбцы, ID, и т. post_status д. Таким образом, в этом случае настройка $my_post['ID'] = $a ничего не делает для вас.

    Попробуйте использовать: $my_post['id'] = $a->ID; вместо этого. Это должно точно установить ваш идентификатор, прежде чем звонить wp_update_post(), и вы должны быть в деле.

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

    • 0
  3. Я хотел прокомментировать, но похоже, что ваш пост закрыт для комментариев.

    В любом случае, будьте очень осторожны, друг мой, чтобы оставить объявление массива ВНЕ цикла:

    $my_post = array();
    

    в противном случае ваш скрипт будет использовать слишком много памяти и никогда не завершится для большой базы данных!

    Дайте мне знать, если возникнут вопросы

    • 0

Оставить ответ

You must login to add an answer.