X

Пакетное изменение даты постов в WordPress

По мотивам статьи: Пакетное изменение даты для постов DLE написал скрипт который устанавливает дату постов WordPress из заданного диапазона. Таким образом можно раскидать посты в прошлое и будущее (отложенный постинг). Особенно пригодится тем, кто генерирует саттелиты 🙂

Создаем файлик в корне директории WP: www/shuffle-posts.php и добавляем следующее содержимое:

<?php
    require_once(dirname(__FILE__).'/wp-load.php');

    set_time_limit(300);
    $wpdb->show_errors();

    // диапазон раскидывания постов:
    //  от (текущая_дата - $days_minus дней)
    //  до (текущая дата + $days_plus дней)

    $days_minus = 30;
    $days_plus = 90;

    // дальше магия

    $sql = 'SELECT `ID` FROM `'.$wpdb->prefix.'posts`
            WHERE
                `post_type`="post"
            AND
                (`post_status`="future" OR `post_status`="publish")
    ';

    if ( $posts = $wpdb->get_results($sql) )
    {
        // Меняем дату у постов
        foreach ($posts as $post)
        {
            $sql = 'UPDATE `'.$wpdb->prefix.'posts` SET
                       `post_date`= DATE_ADD(
                                        FROM_DAYS( FLOOR( TO_DAYS(NOW())
                                                          + (RAND()*'.$days_plus.')
                                                          - (RAND()*'.$days_minus.')
                                                   )
                                        ),
                                        INTERVAL (FLOOR(RAND()*86400)) SECOND
                       ),
                       `post_date_gmt`=`post_date`,
                       `post_modified`=`post_date`,
                       `post_modified_gmt`=`post_date`
                   WHERE
                       `id`=%d
                   LIMIT 1
            ';

            $psql = $wpdb->prepare($sql, $post->ID);

            $wpdb->query($psql);
        }

        // Обновляем статусы постов

        $sql = 'UPDATE `'.$wpdb->prefix.'posts` SET
                  `post_status`="future"
                WHERE
                  `post_date`>NOW()
                AND
                  `post_type`="post"
                AND
                  (`post_status`="future" OR `post_status`="publish")
        ';

        $wpdb->query($sql);

        $sql = 'UPDATE `'.$wpdb->prefix.'posts` SET
                        `post_status`="publish"
                      WHERE
                        `post_date`<=NOW()
                      AND
                        `post_type`="post"
                      AND
                        (`post_status`="future" OR `post_status`="publish")
        ';

        $wpdb->query($sql);
    }

    die('Complete');

Теперь осталось сделать бэкап базы на всякий случай и можно запускать:

http://site.ru/shuffle-posts.php

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

Комментарии к постам

Я пока не тестил, но должен работать вот такой код:

    $sql = 'UPDATE `'.$wpdb->prefix.'comments` SET
        `comment_date` = DATE_ADD(
                            FROM_DAYS( FLOOR( TO_DAYS(
                                (SELECT `post_date` FROM `wp_posts` WHERE `ID`=`wp_comments`.`comment_post_ID`))
                                + (RAND()*365)
                            )),
                            INTERVAL (FLOOR(RAND()*86400)) SECOND
        ),
        `comment_date_gmt` = `comment_date`
    ';
    $wpdb->query($sql);

Тут 365  = кол-во дней, прибавляемое к дате поста.
Т.е. "дата_комментария" = "дата_поста" + (от 0 до 365 дней).

Кто проверит отпишите работает ли отложенный постинг для комментариев или нет - будут ли появляться комментарии дата которых больше текущей или они автоматически скроются.

-- [Добавлено 04.10.2018] --

Один из посетителей, у которого не очень прокачанные навыки программирования, сказал что решил свою задачу по изменению дат для постов WordPress, с помощью плагина Post Date Randomizer. Я пока его не тестировал, но думаю большинству будет удобнее использовать готовый плагин вместо скрипта.

Категории: CMS Wordpress

Комментарии (8)

  • коменты не обновляет, последнея версия вордпрес.
    может я не туда скрипт вставил? я его добавил к скрипту обновление посто в самый низ. Друг посмотри а..
    спасибо за скрипты

    • привет, могут быть либо ошибки с запросами, либо с самими данными, попробуй перед:
      $wpdb->query($sql)
      добавить
      $wpdb->show_errors()
      если ошибок не будет, тогда возьми запрос и выполни его в Adminer или phpmyadmin, посмотри что получится.

      • ощибка, коменты не хочет обновить

        Parse error: syntax error, unexpected ''.$wpdb->prefix.'' (T_CONSTANT_ENCAPSED_STRING) in /home/admin/web/мой сай.ru/public_html/readme.php on line 3

        • Похоже что, не хватает каких-то кавычек. Вставь в любой редактор с подсветкой синтаксиса, например Notepad++ или онлайн viper-7.com и увидишь где проблема.