Làm thế nào để xuất bản các nút 3 lần một ngày?


8

Tôi có một danh sách các nút chưa được công bố, được tạo bằng mô-đun Views . Tôi muốn một nhiệm vụ được chạy 3 lần một ngày, vào những thời điểm được chỉ định. Mỗi khi tác vụ chạy, chỉ một nút trong danh sách sẽ được xuất bản. Tôi có thể làm cái này như thế nào?

Các bước tôi đã thử

Người lập kế hoạch

Các Scheduler mô-đun đòi hỏi bạn phải xác định thời gian chính xác mà bạn muốn nút được công bố. Điều này làm cho nó phức tạp, vì tôi sẽ phải làm việc khi mỗi nút được dự kiến ​​sẽ được công bố.

Lượt xem Hoạt động hàng loạt + Quy tắc + Lập lịch quy tắc

Với mô-đun Lượt xem hoạt động hàng loạt , bạn có thể tạo danh sách các Nút được hiển thị với mô-đun Quy tắc . Các quy tắc sau đó có thể hành động trên danh sách và xuất bản nút trên danh sách. Bạn có thể yêu cầu Rules chỉ xuất bản một số nút cụ thể.

Điều này hoạt động hoàn hảo. Ngoại trừ, dường như không thể lên lịch Quy tắc để chạy 3 lần một ngày.

Bạn có thể liên kết Quy tắc với công việc Cron của trang web chính, nhưng điều này có vẻ không chính xác lắm vì công việc Cron có thể chạy hơn 3 lần.

Có một mô-đun Lập lịch quy tắc (một mô-đun phụ của Quy tắc), nhưng có vẻ như bạn không thể sử dụng điều kiện Quy tắc này. Dường như cũng không có cách nào để xác định thời gian chạy.

Lập lịch công việc

Điều này cho phép bạn đặt thời gian, nhưng dường như không tích hợp với Quy tắc hoặc Chế độ xem .


Bất kỳ lý do nào bạn không muốn làm điều này thông qua một mô-đun tùy chỉnh? Tôi có thể cung cấp cho bạn một câu trả lời nếu bạn muốn làm theo cách này.
Aram Boyajyan

@Topsitemakers Tôi đã hy vọng sử dụng một mô-đun hiện có, vì nó sẽ được truyền qua nhiều người dùng hơn nên sẽ có mã tốt hơn của tôi!. Tôi có ấn tượng rằng những gì tôi muốn làm là có thể, tôi chỉ cần sắp xếp các bit lập lịch tác vụ!
big_smile

Câu trả lời:


5

Sử dụng các mô-đun VBO, Quy tắc và Lập lịch quy tắc

Về cách tiếp cận của bạn bằng cách sử dụng các mô-đun Lượt xem Hoạt động hàng loạt (VBO) , bộ lập lịch Quy tắc và Quy tắc (mô hình quy tắc ) mà bạn đã viết " dường như không thể lên lịch Quy tắc để chạy 3 lần một ngày. ": Điều đó xuất hiện với tôi "Một" cách tiếp cận hợp lệ.

Những gì bạn thực sự cần làm là một biến thể nhỏ của những gì được giải thích trong hướng dẫn Nhiệm vụ hàng giờ bằng cách sử dụng bộ lập lịch quy tắc : trong trường hợp của bạn, bạn nên sử dụng bù 8 giờ (thay vì chỉ 1).

Và như đã giải thích trong hướng dẫn đó: Ban đầu thực hiện thành phần bằng tay. (từ đó cứ sau 8 giờ, quy tắc sẽ được thực hiện lại).

Sử dụng mô-đun Quy tắc và quy tắc Một lần mỗi ngày

Có một mô-đun khá mới liên quan đến các quy tắc, tức là mô-đun " Quy tắc một lần mỗi ngày ". Đây là cách nó hoạt động (theo nhận xét trong vấn đề 2495775 , từ chủ sở hữu mô-đun):

  • Bạn chỉ định giờ kích hoạt trên trang cài đặt quản trị cho mô-đun này.
  • Kích hoạt quy tắc sau đó sẽ chạy khi các tác vụ cron được chạy đầu tiên sau khi bắt đầu giờ đó . Thời gian chạy thực tế sẽ phụ thuộc vào thời gian tác vụ cron của bạn.

Cách tôi hiểu / Đọc điều này (chưa thử nghiệm với nó mặc dù) là như vậy:

  • "Sự kiện" sẽ chỉ được kích hoạt khi một công việc định kỳ được chạy.
  • Và sự kiện đó sẽ chỉ được kích hoạt 1 lần / ngày, tức là "cron lần sau chạy sau khi hết giờ kích hoạt".

Vì vậy, bằng cách tạo 3 quy tắc tương tự, bạn có thể có 1 trong số chúng chạy xung quanh (giả sử) 6 giờ chiều, một quy tắc khác vào khoảng 2 giờ chiều và một quy tắc vào lúc 10 giờ tối.

PS: Tôi cho rằng câu hỏi này là về D7.


Làm thế nào để tôi có được nó chạy cùng một lúc. Dường như không có tùy chọn để kích hoạt quy tắc tại một thời điểm nhất định.
big_smile

Bạn có quen thuộc với các quy tắc Một lần một ngày? Tham khảo câu trả lời được cập nhật của tôi ... tò mò muốn biết liệu công việc đó có hiệu quả không ...
Pierre.Vriens

"Quy tắc mỗi ngày một lần" chỉ chạy một lần một ngày. Nhưng tôi hy vọng tôi có thể thêm một phần bù để có được số lần tôi muốn. Quy tắc cho phép bạn sử dụng stringtotime(). Nếu "quy tắc mỗi ngày một lần" chạy vào lúc nửa đêm và tôi muốn quy tắc của mình chạy vào lúc 6 giờ tối, liệu +18 hourscó phải là cách chính xác để viết stringtotimelệnh?
big_smile

Đúng là Quy tắc Một lần một ngày chỉ chạy một lần một ngày (như tên của nó cũng chỉ ra). Nhưng nếu bạn xác định 3 quy tắc (tương tự), thì bạn có 3 lần một ngày, phải không? Ngoài ra, kích hoạt thực tế sẽ là khi công việc cron của bạn chạy. Nói cron chạy mỗi giờ, cũng vào 6:05 tối (18:05). Sau đó, "giờ kích hoạt" của bạn phải là một chút trước đó (như +18 giờ), để khi cron tiếp theo chạy (lúc 18:05), bạn sẽ có được kích hoạt. Nếu cron của bạn cũng chạy vào lúc (ví dụ) 12:05 và 04:05, bạn nên có một quy tắc khác với giờ kích hoạt như +12 giờ và một quy tắc khác như +4 giờ.
Pierre.Vriens

1
Mặc dù tôi mới chỉ thử nghiệm 90% nhưng đây là câu trả lời có hiệu quả tốt nhất từ ​​trước đến nay, vì vậy nó nhận được tiền thưởng.
big_smile

1

Bạn có thể đạt được điều này bằng cách sử dụng một số mã hóa.

  1. Một khung nhìn liệt kê tất cả các nút được xuất bản để lập lịch. Nếu bạn cũng áp dụng DraggableViews, bạn có thể cho phép quản trị viên sắp xếp lại các nút bằng cách kéo và thả, điều này luôn luôn tốt.

  2. Một hàm PHP tùy chỉnh publishdaily_get_top_node()thực thi khung nhìn ở trên và trả về NID cho nút trên cùng. Tôi sẽ khuyên bạn nên đặt cái này trong một mô-đun nhỏ tùy chỉnh.

  3. Một quy tắc được kích hoạt khi chạy cron và kiểm tra xem đã đến lúc xuất bản một nút mới chưa (bằng cách nói, kiểm tra xem thời gian có nằm trong khoảng từ 00.00 đến 00.15 hay không - tùy thuộc vào tần suất cron của bạn chạy). Nếu đó là thời gian, thì nó kích hoạt 'nút tải' hành động và sử dụng publishdaily_get_top_node()để tải NID. Sau đó, nó xuất bản các nút được tải.

Nếu bạn muốn làm cho nó sạch hơn nữa, bạn viết một plugin Rules thay vì chỉ là một hàm PHP.

Nếu bạn muốn nó không sạch sẽ, bạn viết hàm trực tiếp trong một hành động để thực thi mã PHP tùy ý.

Tài liệu tham khảo


checking if the time is between 00.00 and 00.15Làm thế nào bạn sẽ kiểm tra thời gian trong các quy tắc? Cảm ơn.
big_smile

bạn có thể sử dụng bộ lập lịch quy tắc hoặc bộ lập lịch công việc
rfegade

Chào mừng đến với câu trả lời của Drupal! Nếu bạn định sao chép-dán câu trả lời, vui lòng liên kết lại bài gốc.
kiamlaluno

1
  1. Định cấu hình công việc cron bằng lệnh cron vào những thời điểm bạn muốn.

  2. Tạo một mô-đun để thực hiện hook_cron (). Để cập nhật nút đầu tiên của bạn là $node->status = 1.

    $ nút-> status = 0, có nghĩa là chưa được công bố.
    $ nút-> status = 1, có nghĩa là được xuất bản.

    function yourmodule_cron() {
      update $node->status = 1;    
    }
  3. Bạn có thể sử dụng view_get_view () lấy nút nid của bạn

    $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    
    
    }

Làm cách nào để nhắm mục tiêu các nút chưa được công bố? Cảm ơn!
big_smile

Sử dụng view_get_view () để nhận nút NID của bạn
Dong Tao

0

Cho dù bạn sử dụng quy tắc hoặc mã để xuất bản một nút từ đầu chế độ xem của mình, tôi tin rằng cách dễ nhất để lên lịch là sử dụng Ultimate Cron .

Đặt bộ lập lịch thành Crontab và cho tác vụ cụ thể, bạn có thể nói chính xác khi nào bạn muốn nó chạy. Chẳng hạn, nếu bạn muốn 8 giờ sáng, 12 giờ trưa và 4 giờ chiều, bạn có thể thực hiện quy tắc:

0 8,12,16 * * *

Thêm thông tin:

Elysia Cron dường như cho phép các tác vụ cron tùy chỉnh, có thể cho phép bạn nhắm mục tiêu một quy tắc cụ thể (có thể thông qua mã php).


với Ultimate Cron là có thể kích hoạt quy tắc. Tôi đã thử chơi với nó, nhưng không thể tìm ra. Các quy tắc dường như không thể đáp ứng với các công việc định kỳ cụ thể (nó phản ứng với tất cả chúng).
big_smile

Tôi không nghĩ vậy nhưng có vẻ như Elysia Cron có thể cho phép bạn tạo công việc tùy chỉnh.
Darvanen

0

Tạo quy tắc như sau:

Tại / admin / config / workflow / quy tắc / thành phần / thêm

Tạo một "Tập hợp hành động": Name = Unpublish Biến nội dung: Kiểu dữ liệu = Node Label = Node Machine name = node -Continue-

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

Tại / admin / config / workflow / rule Tạo một "quy tắc": Name = Unpublish Rule React on event = Node> Sau khi lưu nội dung mới Hạn chế theo loại = loại nội dung của bạn -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-

Đó là, không cần thiết phải lọc nội dung khi tạo thành phần cũng như không thêm điều kiện loại nội dung trong quy tắc.

Ngoài ra, hãy kiểm tra cài đặt cron trang web của bạn từ Quản trị viên >> Cấu hình >> Hệ thống >> Cron (admin / config / system / cron)

Hãy cho tôi biết nếu bạn phải đối mặt với bất kỳ truy vấn / mối quan tâm liên quan đến điều này.


Cảm ơn! Làm cách nào để chỉ định thời gian quy tắc sẽ chạy? (Tôi chỉ muốn nó chạy vào những thời điểm cụ thể). Làm cách nào để tôi chỉ xuất bản một trong các nút trong danh sách Lượt xem của các nút chưa được công bố?
big_smile
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.