Main > CMS | Databases | DLE | MySQL > Пакетное изменение даты для постов DLE

Пакетное изменение даты для постов DLE

13.02.2012 54 comments » Views: 14,239

DLE

В DLE (да и не только в нем) есть замечательная функция - отложенный постинг. Теперь представьте ситуацию у Вас есть много контента, например 100к постов, и Вы хотите его разбросать на публикацию, да так чтобы посты получили даты от минус года до плюс 2х лет.

Собственно вот сам код, написанный и проверенный на DLE

кидаем его в
www/updater.php
и запускаем
http://site.ru/updater.php

После того как скрипт будет выполнен, Ваши посты раскидаются по датам:

--[добавлено 09.11.2010]--

По просьбе посетителя добавил, так же генерацию случайного времени, т.е. дата теперь будет иметь вид: 21.04.2010 11:45:01, вместо 21.04.2010 00:00:00

Так же распишу, что означают числа в скрипте:

1560 = кол-во дней вперед, от текущей даты
730 = кол-во дней назад от текущей даты
86400 = время в секундах которое будет добавляться для генерации чч:мм:сс

В основном, конечно же, Вас будут интересовать первые два параметра.

--[добавлено 25.01.2011]--
Для тех кто хочет раскидать новости только на прошлое, запрос примет вид:

--[добавлено 20.11.2013]--

Аналогичный скрипт для WordPress: Пакетное изменение даты постов в WordPress

--[добавлено 05.02.2019]--

В связи с тем, что PHP 7+ отказались от поддержки функций семейства mysql_, переписал скрипт на mysqli_. Изменений не много:

Версия не требующая подключения dbconfig.php, но требующая указать данные подключения к базе в самом скрипте

--[добавлено 08.02.2019]--

Написал скрипт, где все это можно сделать в пару кликов: https://github.com/orlov0562/ddle

DDLE -скрипт рандомизации дат постов DLE

--[добавлено 13.02.2019]--

Обновил скрипт , скачать можно тут: ddle.php, репозиторий тут: https://github.com/orlov0562/ddle

Добавил обновление комментариев

Между комментариями можно задать интервал (по-умолчанию от 1 до 7 дней).

Работает это так:
- обновляется дата поста
- выбираются все комментарии к посту с сортировкой по дате добавления
- поочередно комментарии обновляются
- к дате поста добавляется случайное смещение из заданного диапазона (например, 2 дн, из диапазона от 1 дн до 7дн )
- это смещение, выбирается относительно даты поста/комментария

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

Author: | Rating: 4/5 | Tags: , ,

54 comments.

Write a comment
  1. Максим Reply
    13.04.2023 в 4:09 pm
    Как сделать что бы дата комментария не ставилась выше чем опубликована сама новость? новость добавлена 13.04.2023 а коменитарии кней добавлены 12.05.2026, как сделать что бы коменты были с нормальной датой?
  2. Александр Reply
    04.10.2022 в 5:23 pm
    15.2 не работает 500 ошибка
  3. Валентин Reply
    10.06.2019 в 4:12 pm
    Здравствуйте. Спасибо за скрипт. Очень выручает. Подскажите, пожалуйста, как сделать, чтобы новости распределились по датам равномерно? Например, 100 000 новостей на 1000 дней ровно по 100 штук на дату. Спасибо
    • Vitaliy Orlov Reply
      16.06.2019 в 1:45 pm
      Привет, к сожалению, в контексте реализации текущего скрипта, такого не сделать. Мб, в будущем добавлю, но пока такой возможности нет.
  4. Oleg Reply
    10.03.2019 в 6:41 pm
    Виталий, здравствуйте!
    Есть возможность доработать скрипт, чтобы можно было массово менять дату редактирования новостей в заданном диапазоне дат?

    p.s. Ваш скрипт почему-то на хостинге циклически просит ввести логин/пароль, а на локальном openserver работает.
    • Vitaliy Orlov Reply
      13.03.2019 в 7:48 pm
      Привет,
      1) Не могу точно сказать, почему не работает на хостинге, но могу посоветовать просто отключить авторизацию. Открой файл и измени

      $useHttpBasicAuth = true;
      на

      $useHttpBasicAuth = false;
      Это полностью отключит авторизацию, только не забудь удалить файл, после того как поработаешь.

      2) Про массовую смену в диапазоне дат. Подумаю как это реализовать в интерфейсе, пока это можно делать через расширенные настройки.
      - Нажать "Расширенные настройки"
      - Поставить галочку "Добавить SQL к выборке постов"
      - В поле "Добавить SQL к выборке постов", написать:

      date > "2019-02-12 16:48:20" AND date <= "2019-02-13 16:48:20"
      таким же образом можно делать и более сложные выборки используя любые столбцы таблицы dle_post, например, можно обновить только посты определенного автора из определенной категории

      - Просмотреть результирующий SQL можно кнопкой "Показать SQL"
  5. Оксана Reply
    07.02.2019 в 10:09 am
    Спасибо большое автору за столь чудесное решение простой задачи. Возможно, Вы подскажете еще такой вопрос.
    Мне нужно, чтобы скрипт выполнял такую же задачу в 3 этапа:
    Для первых допустим 200 публикаций дата бралась рандомно (0... +14 дней)
    Потом для следующих 10 000 публикаций RAND +15 + 45
    И далее последние 1800 публикаций растянулись бы от +45 дней до нескольких лет.

    Возможно ли такое реализовать? Отсчет публикации можно брать по id или по счетчику какому-нибудь срабатываний
    • Vitaliy Orlov Reply
      08.02.2019 в 9:37 pm
      Привет :)

      1) Делаешь бэкап базы

      2) Качаешь файлик вот отсюда:
      https://raw.githubusercontent.com/orlov0562/ddle/master/ddle.php копируешь его в корень сайта.

      3) Открываешь site.com/ddle.php , данные для входа admin / ddle

      4) Там в расширенных настройках ставишь:
      а) нужные даты; сортировка id 0-9; лимит: начать с = 0, кол-во = 200
      б) нужные даты; сортировка id 0-9; лимит: начать с = 201, кол-во = 10000
      в) нужные даты; сортировка id 0-9; лимит: начать с = 10201, кол-во = 1000000

      5) Если делаешь прямо на хостинге, не забудь удалить файл ddle.php когда закончишь

      Подробнее про скрипт и скриншот, в моем гитхабе: https://github.com/orlov0562/ddle
      • Оксана Reply
        09.02.2019 в 1:37 pm
        Невероятно просто! Спасибо огромнейшее!
        А комментарии можно каким-то образом учитывать и ставить их дату позже чем дата поста? :)))
        • Vitaliy Orlov Reply
          13.02.2019 в 2:44 pm
          Обновил скрипт, теперь он это делает :)
          • Оксана
            13.02.2019 в 7:21 pm
            Спасибо огромное Вам, очень удобно!
  6. Петр Reply
    02.02.2019 в 10:42 am
    Спасибо за скрипт! А есть версия, поддерживаемя php 7.0? простая замена. mysql на mysqli на помогает
    • Vitaliy Orlov Reply
      05.02.2019 в 1:56 pm
      Привет! Спасибо за комментарий. Версию с mysqli добавил в конец статьи.
  7. Виталик Reply
    30.12.2016 в 12:24 pm
    Приветствую!
    Подскажите пожалуйста правильный код, чтобы рандомно изменить даты у постов которые были опубликованы на сайте в промежутке от 27 января 2013 до 20 апреля 2016 - в этом же промежутке т.е. от 27 января 2013 до 20 апреля 2016 Новости которые идут после 20 апреля 2016 не трогать. Например была новость от 30 января 2013, я запускаю файл и чтобы новость стала например уже от 10 марта 2014 и т.д.
    Сделал код (самый первый), залил на сайт, запускаю файл, но ничего не происходит - белый экран.
    DLE 10.6 utf-8

    Спасибо!
    • Vitaliy Orlov Reply
      31.12.2016 в 1:25 pm
      Ответил на форуме: Пакетное изменение даты для постов DLE
  8. Макс Reply
    04.12.2016 в 1:06 pm
    Круто уж столько вариантов обсудили, подскажите как еще сделать выбор по определенному пользователю?
    • Vitaliy Orlov Reply
      04.12.2016 в 9:33 pm
      Добавить условие сюда

      $query="SELECT * FROM `".PREFIX."_post`";
      примерно вот так

      $query='SELECT * FROM `'.PREFIX.'_post` WHERE `autor`="username"';
  9. Светлана Reply
    17.11.2016 в 3:34 pm
    Наверное что с хостингом, выходит ошибка даже при LIMIT 1, скрипт не срабатывает.

    <?php


    set_time_limit(0);

    class db {}
    require_once('engine/data/dbconfig.php');

    if (!mysql_connect(DBHOST,DBUSER, DBPASS) || !mysql_select_db(DBNAME)) trigger_error('Can not connect to database',E_USER_ERROR);


    $query="SELECT * FROM `".PREFIX."_post` AND `date`>"2016-11-17 00:00:00" ; // от этой даты + 44дня


    $result = mysql_query($query) or trigger_error('SQL: Query error at line '.__LINE__,E_USER_ERROR);

    if (mysql_num_rows($result)>0) while ($row = mysql_fetch_assoc($result)) {
    if (file_exists('stop.txt')) die('Cancel by the user!');
    $query="UPDATE `".PREFIX."_post` SET `date`= DATE_ADD(FROM_DAYS( FLOOR( TO_DAYS( NOW( )) + ( RAND( ) * 1 ) - ( RAND( ) *44 ) ) ), INTERVAL (FLOOR(RAND()*86400)) SECOND) WHERE `id`=".intval($row['id']);
    mysql_query($query) or trigger_error('SQL: Query error at line '.__LINE__,E_USER_ERROR);
    }

    echo 'Complete';

    ?>
    Подскажите все верно? если от текущей даты + 44 дня
    • Vitaliy Orlov Reply
      17.11.2016 в 9:11 pm
      Нужно понять что за ошибка происходит. Если на экране просто пусто, попробуй посмотреть логи в панеле управления. Там всего скорее есть что-то вроде "Error log" или "Журнал ошибок" и там после запуска скрипта должны появляться сообщения об ошибках. Эти сообщения и расскажут что именно происходит. Например, на сервере может не быть поддержки mysql_* функций, т.к. они старые более не рекомендуются к использованию, может еще 1000 причин быть, смотри в логи что за ошибка происходит. Так же, как вариант, создай тикет в поддержку, написав что у тебя скрипт не работает и спроси где посмотреть ошибки.
  10. Светлана Reply
    16.11.2016 в 12:33 am
    Здравствуйте Виталий, покажите пожалуйста пример скрипта от текущей даты +30 дней. Посмотрела комментарии, но к сожалению не совсем поняла приведенного примера.

    Если возможно полностью рабочий вариант скрипта, заранее спасибо!
    • Vitaliy Orlov Reply
      16.11.2016 в 2:30 pm
      Привет! В самом первом примере строку с запросом ($query="...") замени на:

      $query="UPDATE `".PREFIX."_post` SET `date`= SELECT DATE_ADD(NOW(), INTERVAL(FLOOR(RAND()*30*24*60*60)) SECOND) WHERE `id`=".intval($row['id']);
      тут 30*24*60*60 = 30 дней в секундах

      и не забудь перед тестами сделать бэкап
      • Светлана Reply
        16.11.2016 в 7:48 pm
        это из консоли:

        Failed to load resource: the server responded with a status of 500 (Internal Server Error)

        К сожалению не сработал запрос, добавили время на выполнения скрипта, открылась пустая страница без ошибок в консоли, но новости в базе остались прежними, не подскажите с чем связано?
        • Vitaliy Orlov Reply
          16.11.2016 в 8:53 pm
          Возможно, это связанно с большим кол-вом постов и нехваткой ресурсов, т.е. скрипту попросту не хватает времени.
          Попробуй следующее:
          - проверь работает ли этот код вообще, добавь в запрос выбора постов "LIMIT 1", Т.е.

          $query='$query="SELECT * FROM `".PREFIX."_post` LIMIT 1";';
          это ограничит изменения постов до одного и будет понятно ошибки в большом кол-ве постов или нет.
          - Если ошибок нет, тогда попробуй следующее:
          1) Если есть доступ по ssh, авторизоваться и выполнить скрипт из консоли - так не будет лимитов на время выполнения.
          2) Если доступа нет, нужно узнать последний id поста, это можно сделать либо в админке, либо в phpmyadmin-е. Дальше, за 1 запуск обрабатывать только часть постов, например 500. Надо будет перед каждым запуском менять ограничения так:

          $query='$query="SELECT * FROM `".PREFIX."_post` WHERE id >=1 AND id < 500";';
          обработает записи 1-500, потом меняешь дальше

          $query='$query="SELECT * FROM `".PREFIX."_post` WHERE id >=500 AND id < 1000";';
          ну, и дальше по аналогии, пока не дойдешь до максимального id
  11. Дима Reply
    18.05.2016 в 3:51 pm
    Можете помочь за вознаграждение? (если возможно, подскажите как с Вами связаться)
    • Vitaliy Orlov Reply
      19.05.2016 в 3:51 am
      В данный момент, нет. Если нужно срочно, попробуй найти кого-то на weblancer.net или freelansim.ru . Если не срочно, то зарегистрируйся на форуме, создай тему в разделе Помощь пользователям и опиши подробно что хочешь сделать и какие у тебя исходные данные (имя таблицы, название полей и т.д.). Попробую помочь безвозмездно, в свободное время.
  12. Дима Reply
    17.05.2016 в 8:19 pm
    Добрый день, попробую отписаться тут, так как уже помогли с реализацией скрипта в посте.

    Всеобщем возникла непростая для меня задача. Есть сайт на DLE с заполненными (description), но к сожалению в полной новости описание отсутствует, т.к заполняли именно поле Описание для статьи (description).

    Не поможете реализовать скрипт или запрос что-бы скопировать данные из таблиц?

    посмотрел в базе: descr varchar(200) нужно скопировать в full_story text (желательно в начало таьлицы перед <!--dle_image_begin во основном в постах картинки и ножно реализовать к ним описание.
    • Vitaliy Orlov Reply
      18.05.2016 в 2:51 am
      Привет. Давно не работаю с DLE и мне лень туда заглядывать.

      Если просто нужно скопировать одно поле в начало другого, то запрос будет выглядеть примерно так:

      UPDATE `table` SET `full_story_text` = CONCAT(`descr`, ' ', `full_story_text`)
      Про строковые операции в mysql можно почитать тут: Mysql string functons

      И не забудь сделать бэкап базы, перед тестами :)
      • Дима Reply
        18.05.2016 в 8:39 am
        #1146 - Table '**.table' doesn't exist к сожалению несрабатывает запрос((
        • Vitaliy Orlov Reply
          18.05.2016 в 1:21 pm
          Это был пример запроса, тебе его надо подогнать под свои нужды. В частности, вместо table указать нужную таблицу, проверить название полей (descr, full_story_text и т.д.) и по необходимости дополнить всем остальным (WHERE, LIMIT и т.д.).
  13. cosmos Reply
    29.04.2016 в 4:58 am
    Здраствуйте, на первом сайте сработало (3к новостей).

    А вот на 2 к сожалению не вышло, (20 к новостей) - пишет 502 Bad Gateway, возможно как-то поменять скрипт чтобы изменить нагрузку на сервер, спасибо!
    • Vitaliy Orlov Reply
      29.04.2016 в 2:58 pm
      Это ограничение nginx-а на вермя выполнения скрипта. Самый простой вариант - запустить скрипт из командной строки авторизовавшись по ssh. Если такой возможности нет, тогда разделить диапозон по id на равные части, типа того:


      ... WHERE (id>=1 AND id < 100) AND (...)
      потом следующий диапозон:

      ... WHERE (id>=100 AND id < 200) AND (...)
      и т.д.
      • cosmos Reply
        03.05.2016 в 6:34 am
        Возможно это из-за недостачи памяти на сервере. Пишет "Killed", если пытаюсь запустить с ssh.

        Можно получить полную строчку, после того как начинаеться - "WHERE".

        Я в этом коде вообще не понимаю, не получилось запустить ))
        • Vitaliy Orlov Reply
          03.05.2016 в 7:40 am
          Killed = не должно быть, возможно какие-то ограничения провайдера, это обсуждать с ним надо.

          чтобы добавить выборку по id, для DLE (первый пример в статье), надо, это


          $query="SELECT * FROM `".PREFIX."_post`";
          изменить на


          $query="SELECT * FROM `".PREFIX."_post` WHERE `id`>=1 AND `id`<=100";
          и дальше, по аналогии, пока не пройдешь весь диапозон:


          $query="SELECT * FROM `".PREFIX."_post` WHERE `id`>=100 AND `id`<=200";
          максимальный id можно глянуть либо в админке, либо в phpmyadmin, либо в adminer

          Есть еще другой вариант:
          - качаешь openserver к себе на пк
          - перетаскиваешь базу и сайт в него
          - делаешь все что задумал, без ограничений
          - готовую версию заливаешь обратно на хостинг
          • cosmos
            04.05.2016 в 2:40 am
            Получилось! Вы даже для инвалида костыль подберёте ))
  14. Алексей Reply
    22.04.2016 в 2:46 pm
    Возможно ли раскидать материалы только от 22-04-16 например, а все что раньше не трогать?
    • Vitaliy Orlov Reply
      24.04.2016 в 8:59 am
      Возможно:

      1) если даты на которые будут раскидываться посты, так же начинаются от 22-04-16, тогда можно добавить условие в выборку, типа того:

      UPDATE tbl ... WHERE (...)
      AND `date`>"2016-04-22 00:00:00"
      2) другой вариант, делать выборку изменяемых постов подзапросом:

      UPDATE tbl ... WHERE (...)
      AND `id` IN (SELECT id FROM tbl WHERE date>"2016-04-22 00:00:00" AND date<"2016-04-27 00:00:00")
  15. Юрий Reply
    24.01.2016 в 1:42 pm
    А можно ли сделать тоже самое, но не от текущей даты а от даты самих постов плясать? Тоесть к примеру каждый пост поменяет дату +/- месяц от собственной даты (даты самого поста), это позволило бы сохранить общий порядок когда есть посты на пару лет назад
    • Vitaliy Orlov Reply
      24.01.2016 в 2:32 pm
      Можно, SQL будет типа того:

      .. SET `date`= DATE_ADD(`date`, INTERVAL 1 MONTH) WHERE ..
      интервал можно указывать в разных форматах, как "+время" так и "-время". Подробнее про форматы тут: Date and Time Functions
  16. Дима Reply
    17.01.2016 в 8:39 am
    Спасибо, проверил работает)))
  17. Дима Reply
    16.01.2016 в 10:18 am
    Хороший скрипт, как реализовать для определенных категорий???
    • Vitaliy Orlov Reply
      16.01.2016 в 12:42 pm
      Привет, спасибо :)

      У меня нет сейчас возможности убедиться в правильном названии поля, но если мне не изменяет память, в таблице `dle_post` есть поле `category`, в котором хранится id категории. Это можно проверть в phpMyAdmin или Adminer.

      Если там действительно есть такое поле, тогда надо этот запрос:

      $query="SELECT * FROM `".PREFIX."_post`";
      поменять на:

      $query="SELECT * FROM `".PREFIX."_post` WHERE `category`=123";
      либо если нужно сразу несколько категорий, тогда так:

      $query="SELECT * FROM `".PREFIX."_post` WHERE `category` IN (123, 124, 125)";
      если в WHERE будут какие-то другие поля кроме категории, по которым нет индекса, а постов много (например больше 100k), тогда быстрее будет работать запрос такого вида:

      $query="SELECT * FROM `".PREFIX."_post` WHERE `xfields`<>"" AND (`category`=123 OR `category`=124 OR `category`=125)";
  18. Vitaliy Orlov Reply
    08.03.2014 в 1:17 pm
    Еще один SQL сниппет позволяющий отнять кол-во дней от текущей даты для всех постов:

    UPDATE `dle_post` SET `date` = DATE_SUB(`date`, INTERVAL 365 DAY)
  19. Sneerg Reply
    04.12.2013 в 9:01 pm
    Отличный скрипт! Неплохо было бы сделать аналогию, но только для комментариев к постам...
    • Vitaliy Orlov Reply
      05.12.2013 в 6:43 am
      Спасибо, подумаю на этим!
      • Sneerg Reply
        09.12.2013 в 11:16 pm
        Впринципе неплохо работает вариант просто в скрипте заменить _posts на _comments.
        Но даты комментариев разбрасываются случайно, иногда получается, что комментарий размещен раньше, чем была размещена сама статья. Нужно встроить проверку на то, чтобы дата комментария была не раньше даты поста, к которому он размещен...
        • Vitaliy Orlov Reply
          10.12.2013 в 3:22 pm
          Надо после раскидывания всех постов, выполнить такой запрос:
          UPDATE `wp_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`
          Тут 365 = это кол-во дней от даты поста, т.е. "дата поста" + (от 0 до 365 дней). Единственное не знаю работает ли отложенный постинг для комментариев.. Отпишите кто воспользуется :)
  20. Олег Reply
    13.11.2013 в 11:24 pm
    Подскажите пожалуйста как сделать что бы новости распределились типа они были залиты 5 лет назад самая первая и до 10 лет назад были рандомно распределены
    Заранее большое спасибо за ответ
    • Vitaliy Orlov Reply
      20.11.2013 в 9:14 am
      В первом скрипте из поста изменится строчка на такую:

      $query="UPDATE `".PREFIX."_post` SET `date`=DATE_ADD( FROM_DAYS( FLOOR( TO_DAYS( NOW( ) ) - 1825 - ( RAND( ) *1825 ) ) ) , INTERVAL( FLOOR( RAND( ) *86400 ) )
      SECOND ) WHERE `id`=".intval($row['id']);
      Мы отнимаем от текущей даты 5 лет: 1825 = 5 * 365
      Потом рандомно отнимаем еще от 1го до 1825 дней
      В итоге получается диапозон от -10 до -5 лет от текущей даты
  21. Виктор Reply
    13.11.2013 в 8:57 pm
    Помогите, пожалуйста, как переделать такой скрипт для работы с wordpress?
    • Vitaliy Orlov Reply
      20.11.2013 в 9:29 am
      Смотри дополнение в посте.
  22. Мария Reply
    17.09.2013 в 8:00 am
    Большое спасибо за столь развернутый и оперативный ответ! Вечером обязательно попробую :-)
  23. Vitaliy Orlov Reply
    17.09.2013 в 7:41 am
    Привет, Мария!

    Смотри, вычесть кол-во дней можно с помощью команды INTERVAL * DAY

    SELECT NOW() - INTERVAL 60 DAY
    Вот тут подробнее: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add

    соответственно, чтобы тебе передвинуть все даты постов на 60 дней назад надо выполнить такой запрос в скрипте:

    $query="UPDATE `".PREFIX."_post` SET `date`= `date` - INTERVAL 60 DAY WHERE `id`=".intval($row['id']);
    либо тоже самое можешь сделать без скрипта, например в phpmyadmin:

    UPDATE `dle_post` SET `date`= `date` - INTERVAL 60 DAY
    Важно! Только сделай бэкап базы перед тем как будешь выполнять эти команды!
  24. Мария Reply
    17.09.2013 в 3:55 am
    Виталий, скажите пожайлуста, а что изменить в этих строках, чтобы все даты автоматически поменялись ровно на 60 дней назад, а не рандомно как сейчас? Понимаю что нужно убрать RAND, но как это сделать правильно, к сожалению не знаю:(

Leave a Reply

Your email address will not be published. Required fields are marked *

Allowed HTML-tags: <a>, <code>, <i>, <em>, <strong>, <b>, <u>, <strike>


Links to this post:
  1. Pingback from Пакетное изменение даты постов в Wordpress 13.12.2013