web-dev-qa-db-ja.com

1日に3回ノードを公開する方法は?

Views モジュールで作成された非公開ノードのリストがあります。タスクを1日に3回、指定した時間に実行したい。タスクが実行されるたびに、リスト上のノードの1つだけが公開されます。これどうやってするの?

私が試した手順

スケジューラー

Scheduler モジュールでは、ノードを公開する正確な時間を指定する必要があります。これにより、各ノードが公開されることになっているときに計算する必要があるため、複雑になります。

一括操作+ルール+ルールスケジューラの表示

Views Bulk Operations モジュールを使用すると、 Rules モジュールに公開されるノードのリストを作成できます。その後、ルールはリストに作用し、ノードをリストに公開できます。特定の数のノードのみを公開するようにルールに指示できます。

これは完全に機能します。ただし、ルールを1日に3回実行するようにスケジュールすることはできません。

ルールをメインサイトのCronジョブにリンクできますが、Cronジョブは3回以上実行される可能性があるため、これはあまり正確ではないようです。

ルールスケジューラモジュール(ルールのサブモジュール)がありますが、これはルール条件を使用できるようには見えません。また、実行時間を指定する方法がないようです。

ジョブスケジューラ

これにより時間を設定できますが、 Rules または Views と統合されていないようです。

8
big_smile

モジュールVBO、ルール、ルールスケジューラの使用

モジュール Views Bulk Operations(VBO)Rules およびルールスケジューラ( Rules のサブモジュール)を使用したアプローチについて、 "1日に3回実行するようにルールをスケジュールすることはできないようです。 ":これは" a "の有効なアプローチです。

実際に行う必要があるのは、チュートリアルで説明されているもののマイナーバリエーションです ルールスケジューラを使用した時間ごとのタスク :この場合、オフセットを1時間ではなく8時間にする必要があります。

そして、そのチュートリアルでも説明されているように:最初にコンポーネントを手動で実行します。(それ以降、8時間おきにルールが再度実行されます)。

モジュールルールとルールを1日1回使用する

ルールに関連するかなり新しいモジュール、つまり " Rules Once per Day "モジュールがあります。これがどのように機能するかです(モジュール所有者からの 問題2495775のコメント に従って):

  • このモジュールの管理設定ページで、トリガー時間を指定します。
  • ルールトリガーは、その時間の開始後にcronタスクが最初に実行されたときに実行されます。実際の実行時間は、cronタスクのタイミングによって異なります。

私がこれを理解する/読む方法(ただし、まだ実験していない)は次のようになります。

  • 「イベント」は、cronジョブが実行されたときにのみトリガーされます。
  • そして、そのイベントは1日に1回だけトリガーされます。つまり、「トリガー時間が経過すると、cronが次に実行されます」。

したがって、3つの同様のルールを作成することで、そのうちの1つを(たとえば)午後6時に実行し、別のルールを午後2時に実行し、最後のルールを午後10時に実行することができます。

PS:この質問はD7に関するものだと思います。

5
Pierre.Vriens
  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    
    
    }
    
1
Dong Tao

これは、いくつかのコーディングを使用して実現できます。

  1. スケジューリングのために公開されているすべてのノードをリストするビュー。 DraggableViews も適用する場合、管理者はドラッグアンドドロップでノードを並べ替えることができます。

  2. 上記のビューを実行して最上位ノードのNIDを返すカスタムPHP function publishdaily_get_top_node()。これをカスタムミニモジュールに配置することをお勧めします。

  3. Cronの実行時にトリガーされ、新しいノードを公開するタイミングかどうかを確認するルール(たとえば、時間が00.00と00.15の間にあるかどうかを確認します-cronの実行頻度によって異なります)。それが時間である場合、アクション「ノードのロード」を起動し、publishdaily_get_top_node()を使用してロードするNIDを取得します。次に、ロードされたノードを公開します。

さらにクリーンにしたい場合は、PHP関数ではなく、Rulesプラグインを作成します。

よりクリーンにしたくない場合は、任意のPHPコードを実行するためのアクションで関数を直接記述します。

参照

1
rfegade

ルールまたはコードを使用してビューの上部から単一のノードを公開するかどうかに関係なく、それをスケジュールする最も簡単な方法は ltimate Cron を使用することです。

スケジューラーをCrontabに設定し、特定のタスクについて、実行したいときにそれを正確に通知できます。たとえば、午前8時、正午、午後4時が必要な場合は、ルールを作成できます。

0 8,12,16 * * *

さらに詳しい情報:

Elysia Cron は、カスタムcronタスクを許可しているように見えます。これにより、特定のルールをターゲットにすることができます(おそらくphpコード経由)。

0
Darvanen

次のようにルールを作成します。

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

「アクションセット」を作成します。名前=非公開コンテンツ変数:データタイプ= Nodeラベル= Nodeマシン名=ノード-続行-

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

/ admin/config/workflow/rulesで「ルール」を作成します。名前=非公開ルールReact =イベント= Node>新しいコンテンツを保存した後タイプで制限=コンテンツタイプ-保存-

    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設定を確認してください

これに関して何かご質問やご不明な点がありましたらお知らせください。