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

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

13.02.2012 41 комментарий » Просмотры: 12 644
 

В 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

Автор: | Теги: , ,

Важно

У нас заработал ФОРУМ. Все вопросы, которые не касаются статьи, а так же вопросы по конкретно вашему случаю нужно задавать и обсуждать именно там, в разделе "Помощь пользователям".

41 комментарий

Написать свой
  1. Виталик Ответить
    30.12.2016 в 12:24 пп
    Приветствую!
    Подскажите пожалуйста правильный код, чтобы рандомно изменить даты у постов которые были опубликованы на сайте в промежутке от 27 января 2013 до 20 апреля 2016 - в этом же промежутке т.е. от 27 января 2013 до 20 апреля 2016 Новости которые идут после 20 апреля 2016 не трогать. Например была новость от 30 января 2013, я запускаю файл и чтобы новость стала например уже от 10 марта 2014 и т.д.
    Сделал код (самый первый), залил на сайт, запускаю файл, но ничего не происходит - белый экран.
    DLE 10.6 utf-8

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

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

      $query='SELECT * FROM `'.PREFIX.'_post` WHERE `autor`="username"';
  3. Светлана Ответить
    17.11.2016 в 3:34 пп
    Наверное что с хостингом, выходит ошибка даже при 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
      Vitaliy Orlov Ответить
      17.11.2016 в 9:11 пп
      Нужно понять что за ошибка происходит. Если на экране просто пусто, попробуй посмотреть логи в панеле управления. Там всего скорее есть что-то вроде "Error log" или "Журнал ошибок" и там после запуска скрипта должны появляться сообщения об ошибках. Эти сообщения и расскажут что именно происходит. Например, на сервере может не быть поддержки mysql_* функций, т.к. они старые более не рекомендуются к использованию, может еще 1000 причин быть, смотри в логи что за ошибка происходит. Так же, как вариант, создай тикет в поддержку, написав что у тебя скрипт не работает и спроси где посмотреть ошибки.
  4. Светлана Ответить
    16.11.2016 в 12:33 дп
    Здравствуйте Виталий, покажите пожалуйста пример скрипта от текущей даты +30 дней. Посмотрела комментарии, но к сожалению не совсем поняла приведенного примера.

    Если возможно полностью рабочий вариант скрипта, заранее спасибо!
    • Vitaliy Orlov
      Vitaliy Orlov Ответить
      16.11.2016 в 2:30 пп
      Привет! В самом первом примере строку с запросом ($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 дней в секундах

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

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

        К сожалению не сработал запрос, добавили время на выполнения скрипта, открылась пустая страница без ошибок в консоли, но новости в базе остались прежними, не подскажите с чем связано?
        • Vitaliy Orlov
          Vitaliy Orlov Ответить
          16.11.2016 в 8:53 пп
          Возможно, это связанно с большим кол-вом постов и нехваткой ресурсов, т.е. скрипту попросту не хватает времени.
          Попробуй следующее:
          - проверь работает ли этот код вообще, добавь в запрос выбора постов "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
  5. Дима Ответить
    18.05.2016 в 3:51 пп
    Можете помочь за вознаграждение? (если возможно, подскажите как с Вами связаться)
    • Vitaliy Orlov
      Vitaliy Orlov Ответить
      19.05.2016 в 3:51 дп
      В данный момент, нет. Если нужно срочно, попробуй найти кого-то на weblancer.net или freelansim.ru . Если не срочно, то зарегистрируйся на форуме, создай тему в разделе Помощь пользователям и опиши подробно что хочешь сделать и какие у тебя исходные данные (имя таблицы, название полей и т.д.). Попробую помочь безвозмездно, в свободное время.
  6. Дима Ответить
    17.05.2016 в 8:19 пп
    Добрый день, попробую отписаться тут, так как уже помогли с реализацией скрипта в посте.

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

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

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

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

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

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

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


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

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

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

        Я в этом коде вообще не понимаю, не получилось запустить ))
        • Vitaliy Orlov
          Vitaliy Orlov Ответить
          03.05.2016 в 7:40 дп
          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 дп
            Получилось! Вы даже для инвалида костыль подберёте ))
  8. Алексей Ответить
    22.04.2016 в 2:46 пп
    Возможно ли раскидать материалы только от 22-04-16 например, а все что раньше не трогать?
    • Vitaliy Orlov
      Vitaliy Orlov Ответить
      24.04.2016 в 8:59 дп
      Возможно:

      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")
  9. Юрий Ответить
    24.01.2016 в 1:42 пп
    А можно ли сделать тоже самое, но не от текущей даты а от даты самих постов плясать? Тоесть к примеру каждый пост поменяет дату +/- месяц от собственной даты (даты самого поста), это позволило бы сохранить общий порядок когда есть посты на пару лет назад
    • Vitaliy Orlov
      Vitaliy Orlov Ответить
      24.01.2016 в 2:32 пп
      Можно, SQL будет типа того:

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

      У меня нет сейчас возможности убедиться в правильном названии поля, но если мне не изменяет память, в таблице `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)";
  12. Vitaliy Orlov
    Vitaliy Orlov Ответить
    08.03.2014 в 1:17 пп
    Еще один SQL сниппет позволяющий отнять кол-во дней от текущей даты для всех постов:

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

      $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 лет от текущей даты
  15. Виктор Ответить
    13.11.2013 в 8:57 пп
    Помогите, пожалуйста, как переделать такой скрипт для работы с wordpress?
    • Vitaliy Orlov
      Vitaliy Orlov Ответить
      20.11.2013 в 9:29 дп
      Смотри дополнение в посте.
  16. Мария Ответить
    17.09.2013 в 8:00 дп
    Большое спасибо за столь развернутый и оперативный ответ! Вечером обязательно попробую :-)
  17. Vitaliy Orlov
    Vitaliy Orlov Ответить
    17.09.2013 в 7:41 дп
    Привет, Мария!

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

    SELECT NOW() - INTERVAL 60 DAY
    Вот тут подробнее: mysql, date and time functions

    соответственно, чтобы тебе передвинуть все даты постов на 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
    Важно! Только сделай бэкап базы перед тем как будешь выполнять эти команды!
  18. Мария Ответить
    17.09.2013 в 3:55 дп
    Виталий, скажите пожайлуста, а что изменить в этих строках, чтобы все даты автоматически поменялись ровно на 60 дней назад, а не рандомно как сейчас? Понимаю что нужно убрать RAND, но как это сделать правильно, к сожалению не знаю:(

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Разрешены HTML-теги: <a>, <code>, <i>, <em>, <strong>, <b>, <u>, <strike>


Ниже приводятся ссылки на блоги ссылающиеся на этот пост:
  1. Pingback от Пакетное изменение даты постов в Wordpress 13.12.2013