Как публиковать узлы 3 раза в день?

8

У меня есть список неопубликованных узлов, созданных с помощью модуля Views . Я хотел бы, чтобы задание выполнялось 3 раза в день в указанное время. Каждый раз, когда выполняется задача, должен быть опубликован только один из узлов в списке. Как я могу это сделать?

Шаги, которые я пробовал

планировщик

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

Представления Массовые операции + Правила + Планировщик правил

С помощью модуля « Bulk Operations » можно создать список узлов, которые доступны для модуля « Правила ». Затем правила могут действовать в списке и публиковать узел в списке. Вы можете указать правилам публиковать только определенное количество узлов.

Это работает отлично. За исключением того, что не представляется возможным запланировать выполнение правила 3 ​​раза в день.

Вы можете связать правило с заданием Cron основного сайта, но это не очень точно, поскольку задание Cron может выполняться более 3 раз.

Существует модуль планировщика правил (подмодуль правил), но не похоже, что вы можете использовать это условие правил. Также, похоже, нет способа указать время выполнения.

Планировщик заданий

Это позволяет вам установить время, но, похоже, оно не интегрируется с правилами или представлениями .

большая улыбка
источник
По какой причине вы не хотите делать это через пользовательский модуль? Я могу дать вам ответ, если вы хотите сделать это таким образом.
Арам Бояджян
@Topsitemakers Я надеялся использовать существующий модуль, так как он будет передан большему количеству пользователей, поэтому код будет лучше, чем мой !. У меня сложилось впечатление, что то, что я хочу сделать, возможно, мне просто нужно отсортировать бит планирования задач!
big_smile

Ответы:

5

Использование модулей VBO, Правила и Правила Планировщика

О вашем подходе с использованием модулей Views Bulk Operations (VBO) , Планировщика правил и правил (подмодуль правил ), для которого вы написали « не представляется возможным запланировать запуск правила 3 ​​раза в день ». Это мне кажется «А» действительный подход.

Что вам действительно нужно сделать, так это небольшая вариация того, что объясняется в учебном руководстве « Почасовые задачи» с использованием планировщика правил : в вашем случае вы должны использовать смещение 8 часов (вместо 1).

И, как объяснено в этом уроке: сначала запустите компонент вручную. (с этого момента каждые 8 ​​часов правило будет выполняться снова).

Использование модулей Правила и правила Один раз в день

Существует довольно новый модуль, связанный с правилами, то есть модуль « Правила один раз в день ». Вот как это работает (согласно комментарию в выпуске 2495775 от владельца модуля):

  • Вы указываете час запуска на странице настроек администрирования для этого модуля.
  • Триггер «Правило» будет запущен при первом запуске задач cron после начала этого часа . Фактическое время выполнения будет зависеть от времени вашей задачи cron.

То, как я понимаю / читаю это (пока еще не экспериментировал с этим), выглядит так:

  • «Событие» будет запускаться только при запуске задания cron.
  • И это событие будет запускаться только 1 раз / день, то есть «в следующий раз, когда cron запускается после того, как прошел триггерный час».

Таким образом, создав 3 аналогичных правила, вы можете запустить 1 из них (скажем) в 6 часов вечера, еще один - около 2 часов дня, а один - в 10 часов вечера.

PS: я предполагаю, что этот вопрос о D7.

Pierre.Vriens
источник
Как мне заставить его работать за один раз. Кажется, нет возможности активировать правило в определенное время.
big_smile
Вы знакомы с модулем «Правила один раз в день»? Обратитесь к моему обновленному ответу ... любопытно услышать, работает ли эта болванка ...
Pierre.Vriens
«Правила один раз в день» работает только один раз в день. Но я надеюсь, что смогу добавить смещение, чтобы получить желаемое время. Правила позволяют использовать stringtotime(). Если «правила один раз в день» выполняются в полночь, и я хочу, чтобы мое правило выполнялось в 18:00, будет +18 hoursли правильный способ написать stringtotimeкоманду?
big_smile
Правда, что правила один раз в день запускаются только один раз в день (как указывает и его название). Но если вы определите 3 (аналогичных) правила, у вас будет 3 раза в день, верно? Кроме того, фактический триггер будет при выполнении задания cron. Скажем, хрон работает каждый час, также в 18:05 (18:05). Тогда ваш «триггерный час» должен быть немного раньше (например, +18 часов), чтобы при запуске следующего крона (в 18:05) вы получали триггер. Если ваш cron также работает (например, в 12:05 и 04:05), у вас должно быть другое правило с часом запуска, например, +12 часов, и еще одно правило, например, +4 часа.
Pierre.Vriens
1
Хотя я только 90% проверил это, этот ответ сработал лучше всего, поэтому он получает награду.
big_smile
1

Вы можете достичь этого с помощью некоторого кодирования.

  1. Представление, в котором перечислены все узлы, опубликованные для планирования. Если вы также применяете DraggableViews, вы можете позволить администраторам переупорядочивать узлы путем перетаскивания, что всегда хорошо.

  2. Пользовательская функция PHP, publishdaily_get_top_node()которая выполняет приведенное выше представление и возвращает NID для верхнего узла. Я бы порекомендовал поместить это в специальный мини-модуль.

  3. Правило, которое запускается при запуске cron и проверяет, пора ли публиковать новый узел (скажем, проверяя, находится ли время между 00.00 и 00.15 - в зависимости от того, как часто работает ваш cron). Если время пришло, запускается действие «загрузить узел» и используется publishdaily_get_top_node()для загрузки NID. Затем он публикует загруженный узел.

Если вы хотите сделать его еще более чистым, вы пишете плагин Rules вместо просто функции PHP.

Если вы хотите, чтобы он был менее чистым, вы пишете функцию непосредственно в действии для выполнения произвольного PHP-кода.

Ссылка

rfegade
источник
checking if the time is between 00.00 and 00.15Как бы вы проверили время в правилах? Спасибо.
big_smile
Вы можете использовать планировщик правил или планировщик заданий
rfegade
Добро пожаловать в ответы Drupal! Если вы собираетесь скопировать и вставить ответ, пожалуйста, ссылку на исходное сообщение обратно.
kiamlaluno
1
  1. Конфигурирование заданий cron с помощью команды cron в указанное вами время.

  2. Создайте модуль для реализации hook_cron (). Чтобы обновить ваш первый узел как $node->status = 1.

    $ node-> status = 0, означает неопубликованный.
    $ node-> status = 1, означает опубликовано.

    function yourmodule_cron() {
      update $node->status = 1;    
    }
    
  3. Вы можете использовать views_get_view (), чтобы получить свой nid узла

    $view = views_get_view('your_views_name');
    
    $view->execute('default');
    
    $view->preview();
    
    $renderer = $view->style_plugin->row_plugin;
    
    foreach ($view->result as $index => $row) {
    
      // get node NID from first row    
    
    }
    
Донг Тао
источник
Как я нацеливаюсь на неопубликованные узлы? Спасибо!
big_smile
Используйте views_get_view (), чтобы получить свой NID узла
Донг Тао
0

Независимо от того, используете ли вы правило или код для публикации одного узла сверху вашего представления, я считаю, что самый простой способ запланировать это - использовать Ultimate Cron .

Установите планировщик в Crontab, и для конкретной задачи вы можете точно сказать , когда вы хотите его запустить. Например, если вы хотите 8:00, 12:00 и 16:00, вы можете сделать правило:

0 8,12,16 * * *

Дальнейшая информация:

Похоже, Elysia Cron позволяет выполнять пользовательские задачи cron, которые могут позволить вам настроить конкретное правило (возможно, с помощью php-кода).

Darvanen
источник
с помощью Ultimate Cron можно вызвать правило. Я пытался играть с этим, но не мог понять это. Кажется, что правила не способны отвечать на определенные задания cron (они реагируют на все).
big_smile
Я так не думаю, но похоже, что Elysia Cron может позволить вам создавать собственные задания.
Дарванен
0

Создайте правило следующим образом:

В / admin / config / workflow / rules / components / add

Создайте «Набор действий»: Имя = Отменить публикацию. Переменные содержимого: Тип данных = Метка узла = Имя машины узла = узел -Продолжить-

    Add Actions:
      Node > Unpublish content
      Data selector = node
      -Save-

В / admin / config / workflow / rules Создайте «правило»: Имя = Отменить публикацию Правило Реагировать на событие = Узел> После сохранения нового содержимого Ограничить по типу = тип содержимого -Save-

    Conditions:
              Content is published
            Data selector = node
              -Save-

    Actions:
      Schedule component evaluation
      Component Value = Unpublish Content
      Scheduled evaluation date data selector = node:field-your-node-date-field
      Identifier value = Unpublish content ID [node:nid] ([node:title]).
      Node Data selector = node
      -Save-

То есть нет необходимости фильтровать контент при создании компонента или добавлять условие типа контента в правило.

Кроме того, проверьте настройку cron на вашем сайте в разделе Администрирование >> Конфигурация >> Система >> Cron (admin / config / system / cron).

Дайте мне знать, если у вас возникнут какие-либо вопросы или сомнения по этому поводу.

AddWeb Solution Pvt Ltd
источник
Спасибо! Как указать время, когда правило должно выполняться? (Я хочу, чтобы он запускался только в определенное время). Как заставить его публиковать только один из узлов в моем списке просмотров неопубликованных узлов?
big_smile