如何每天发布3次节点?


8

我有一个用Views模块创建的未发布节点的列表。我希望一项任务每天在指定的时间运行3次。每次任务运行时,仅应发布列表中的一个节点。我怎样才能做到这一点?

我尝试过的步骤

排程器

调度模块需要你指定要该节点要发布的确切时间。这使事情变得复杂,因为当每个节点都应该发布时,我将不得不进行计算。

查看批量操作+规则+规则计划程序

使用“ 视图批量操作”模块,可以创建暴露于“ 规则”模块的节点列表。然后,规则可以作用于列表,并在列表上发布节点。您可以告诉规则仅发布特定数量的节点。

这很完美。除此以外,似乎无法将规则安排为每天运行3次。

您可以将Rule链接到主站点Cron作业,但这似乎不太精确,因为Cron作业可以运行3次以上。

有一个“规则计划程序”模块(“规则”的子模块),但是您似乎无法使用此“规则”条件。似乎也没有办法指定运行时间。

工作计划

这使您可以设置时间,但似乎没有与RuleViews集成。


您有任何不想通过自定义模块执行此操作的原因吗?如果您想这样做,我可以为您提供答案。
Aram Boyajyan 2015年

@Topsitemakers我希望使用现有模块,因为它将通过更多用户传递,因此比我的代码更好!我觉得我想做的事情是可能的,我只需要对任务计划进行排序即可!
big_smile 2015年

Answers:


5

使用模块VBO,规则和规则计划程序

关于使用模块的方式查看批量操作(VBO) 规则和规则调度(的子模块的规则),为您写了“ 它似乎不可能调度运行规则,每日3次。 ”:这似乎是我“一种”有效的方法。

您实际需要做的是与使用“规则计划程序”的“每小时任务 ”教程中所解释的内容的细微变化:在您的情况下,您应该使用8个小时的偏移量(而不是1个小时)。

并且如该教程中所述:最初手动执行该组件。(此后每隔8个小时将再次执行该规则)。

每天使用模块规则和规则

有一个与规则相关的相当新的模块,即“ 每天一次规则 ”模块。这是它的工作方式(根据模块所有者的问题2495775,):

  • 您可以在此模块的“管理设置”页面上指定触发时间
  • 然后,在该小时开始后第一次运行cron任务时,运行 Rule触发器。实际的运行时间将取决于您的cron任务时间。

我的理解/阅读方式(虽然还没有尝试过)像这样:

  • 仅在运行cron作业时才触发“事件”。
  • 而且该事件每天只会触发1次,即“触发时间过后,下次cron运行”。

因此,通过创建3条相似的规则,您可以让其中1条在(例如)下午6点左右运行,另一条在2 pm左右运行,而另一条在10 pm左右运行。

PS:我假设这个问题与D7有关。


我如何一次运行它。在特定时间似乎没有激活规则的选项。
big_smile 2015年

您是否熟悉“每天一次的规则”模块?请参阅我最新的答案...好奇地想知道那是否可行...
Pierre.Vriens 2015年

“一天一次的规则”每天仅运行一次。但是我希望我可以添加一个偏移量以获得我想要的时间。规则允许您使用stringtotime()。如果“规则每天一次”在午夜运行,并且我希望我的规则在下午6点运行,那么+18 hours编写stringtotime命令的正确方法是吗?
big_smile

诚然,“每天一次的规则”每天仅运行一次(其名称也表明)。但是,如果您定义了3条(相似的)规则,那么您一天就有3次,对吗?另外,实际的触发器将是您的cron作业运行时。说cron每小时运行一次,也是在晚上6:05(18:05)。然后,您的“触发时间”应该在此之前一点点(例如+18小时),以便在下一个cron运行时(在18:05),您将获得触发器。如果您的cron也在(例如)12:05和04:05运行,则您应该有另一条规则,其触发时间为+12小时,而另一条规则为+4小时。
Pierre.Vriens 2015年

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代码的操作中编写该函数。

参考


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 2015年

使用views_get_view()获取您的节点NID
Dong Tao

0

无论您是使用规则还是代码从视图顶部发布单个节点,我都认为最简单的调度方法是使用Ultimate Cron

将调度程序设置为Crontab,对于特定任务,您可以准确地告诉它何时要运行。例如,如果您想要上午8点,中午12点和下午4点,则可以制定规则:

0 8,12,16 * * *

更多的信息:

Elysia Cron似乎允许自定义cron任务,这可能使您可以定位特定规则(也许通过php代码)。


使用Ultimate Cron可以触发规则。我尝试过使用它,但无法弄清楚。规则似乎无法响应特定的cron作业(它对所有这些作业都有反应)。
big_smile

我不这么认为,但看起来Elysia Cron可能允许您创建自定义作业。
Darvanen

0

创建如下规则:

在/ admin / config / workflow / rules / components / add

创建一个“操作集”:名称=未发布内容变量:数据类型=节点标签=节点计算机名称=节点-继续-

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

在/ admin / config / workflow / rules处创建一个“ rule”:名称=取消发布规则对事件做出反应=节点>保存新内容后按类型限制=您的内容类型-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(admin / config / system / cron)检查您的网站cron设置

让我知道您是否对此有任何疑问/疑虑。


谢谢!如何指定规则应运行的时间?(我只希望它在特定时间运行)。如何获取仅发布未发布节点的“视图”列表中的一个节点?
big_smile 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.