Comment publier des nœuds 3 fois par jour?


8

J'ai une liste de nœuds non publiés, créés avec le module Vues . J'aimerais qu'une tâche soit exécutée 3 fois par jour, à des heures spécifiées. Chaque fois que la tâche s'exécute, un seul des nœuds de la liste doit être publié. Comment puis-je faire ceci?

Étapes que j'ai essayées

Planificateur

Le module Planificateur vous oblige à spécifier l'heure exacte à laquelle vous souhaitez que le nœud soit publié. Cela complique les choses, car je devrais déterminer quand chaque nœud est censé être publié.

Vues Opérations en bloc + Règles + Planificateur de règles

Avec les vues en vrac Opérations module, vous pouvez créer une liste de nœuds qui sont exposés au règlement module. Les règles peuvent ensuite agir sur la liste et publier le nœud sur la liste. Vous pouvez demander à Rules de publier uniquement un nombre spécifique de nœuds.

Cela fonctionne parfaitement. Sauf qu'il ne semble pas possible de planifier l'exécution de la règle 3 fois par jour.

Vous pouvez lier la règle à la tâche Cron du site principal, mais cela ne semble pas très précis car la tâche Cron pourrait s'exécuter plus de 3 fois.

Il existe un module Rules Scheduler (un sous-module de Rules), mais il ne semble pas que vous puissiez utiliser cette condition Rules. Il ne semble pas non plus être possible de spécifier la durée de fonctionnement.

Planificateur de travaux

Cela vous permet de définir une heure, mais elle ne semble pas s'intégrer aux règles ou aux vues .


Une raison pour laquelle vous ne voulez pas le faire via un module personnalisé? Je peux vous fournir une réponse si vous voulez le faire de cette façon.
Aram Boyajyan

@Topsitemakers J'espérais utiliser un module existant, car il aura été transmis à plus d'utilisateurs, ce sera donc un meilleur code que le mien !. J'ai l'impression que ce que je veux faire est possible, j'ai juste besoin de trier le bit de planification des tâches!
big_smile

Réponses:


5

Utilisation des modules VBO, Rules and Rules Scheduler

À propos de votre approche à l'aide des modules Views Bulk Operations (VBO) , Rules and Rules Scheduler (sous-module de Rules ), pour lesquels vous avez écrit " il ne semble pas possible de planifier l'exécution de la règle 3 fois par jour. ": Cela me semble "une" approche valable.

Ce que vous devez réellement faire est une variation mineure de ce qui est expliqué dans le didacticiel Tâches horaires à l'aide du planificateur de règles : dans votre cas, vous devez utiliser un décalage de 8 heures (au lieu de 1).

Et comme expliqué également dans ce didacticiel: exécutez initialement le composant manuellement. (à partir de ce moment, toutes les 8 heures, la règle sera à nouveau exécutée).

Utilisation des modules Règles et règles une fois par jour

Il existe un module relativement nouveau lié aux règles, à savoir le module " Rules Once per Day ". Voici comment cela fonctionne (selon le commentaire du numéro 2495775 du propriétaire du module):

  • Vous spécifiez une heure de déclenchement sur la page des paramètres d'administration de ce module.
  • Le déclencheur Rule s'exécutera alors lorsque les tâches cron seront exécutées pour la première fois après le début de cette heure . Le temps d'exécution réel dépendra de la synchronisation de vos tâches cron.

La façon dont je comprends / lis cela (mais je ne l'ai pas encore expérimenté) est la suivante:

  • L '«événement» ne sera déclenché que lors de l'exécution d'une tâche cron.
  • Et cet événement ne sera déclenché qu'une seule fois par jour, c'est-à-dire "la prochaine exécution de cron après le déclenchement de l'heure de déclenchement".

Donc, en créant 3 règles similaires, vous pourriez en avoir une (disons) 18 heures, une autre vers 14 heures et la dernière à 22 heures.

PS: Je suppose que cette question concerne D7.


Comment puis-je le faire fonctionner en même temps. Il ne semble pas être possible d'activer une règle à un certain moment.
big_smile

Connaissez-vous le module Rules Once a Day? Référez-vous à ma réponse mise à jour ... curieux de savoir si ce culd fonctionne ...
Pierre.Vriens

"Rules Once a Day" ne fonctionne qu'une fois par jour. Mais j'espère que je pourrais ajouter un décalage pour obtenir les temps que je veux. Les règles vous permettent d'utiliser stringtotime(). Si «les règles une fois par jour» s'exécutaient à minuit et que je voulais que ma règle s'exécute à 18 h, serait- +18 hoursce la bonne façon d'écrire la stringtotimecommande?
big_smile

Il est vrai que les règles une fois par jour ne s'exécutent qu'une fois par jour (comme son nom l'indique également). Mais si vous définissez 3 règles (similaires), vous en avez alors 3 fois une fois par jour, non? De plus, le déclencheur réel sera lorsque votre tâche cron s'exécute. Say cron fonctionne toutes les heures, également à 18h05 (18h05). Ensuite, votre "heure de déclenchement" devrait être un peu avant (comme +18 heures), de sorte que lorsque le prochain cron s'exécute (à 18h05), vous obtenez le déclencheur. Si votre cron fonctionne également à (par exemple) 12h05 et 04h05, vous devriez avoir une autre règle avec une heure de déclenchement comme +12 heures et encore une autre comme +4 heures.
Pierre.Vriens

1
Bien que je ne l'ai testé qu'à 90%, c'est la réponse qui a le mieux fonctionné jusqu'à présent, donc il obtient la prime.
big_smile

1

Vous pouvez y parvenir en utilisant du codage.

  1. Une vue qui répertorie tous les nœuds qui sont publiés pour la planification. Si vous appliquez également DraggableViews, vous pouvez laisser les administrateurs réorganiser les nœuds par glisser-déposer, ce qui est toujours agréable.

  2. Une fonction PHP personnalisée publishdaily_get_top_node()qui exécute la vue ci-dessus et renvoie le NID du nœud supérieur. Je recommanderais de mettre cela dans un mini-module personnalisé.

  3. Une règle qui est déclenchée lors de l'exécution de cron et vérifie s'il est temps de publier un nouveau nœud (par exemple en vérifiant si l'heure est comprise entre 00.00 et 00.15 - selon la fréquence à laquelle votre cron s'exécute). S'il est temps, il déclenche l'action 'charger le nœud' et utilise publishdaily_get_top_node()pour obtenir le NID à charger. Il publie ensuite le nœud chargé.

Si vous voulez le rendre encore plus propre, vous écrivez un plugin Rules au lieu d'une simple fonction PHP.

Si vous le souhaitez moins propre, vous écrivez la fonction directement dans une action pour exécuter du code PHP arbitraire.

Référence


checking if the time is between 00.00 and 00.15Comment vérifieriez-vous l'heure dans les règles? Merci.
big_smile

vous pouvez utiliser un planificateur de règles ou un planificateur de travaux
rfegade

Bienvenue dans Drupal Answers! Si vous souhaitez copier-coller une réponse, veuillez renvoyer le message d'origine.
kiamlaluno

1
  1. Configuration des tâches cron à l'aide de la commande cron à des moments spécifiés.

  2. Créez un module pour implémenter hook_cron (). Pour mettre à jour votre premier nœud en tant que $node->status = 1.

    $ node-> status = 0, signifie non publié.
    $ node-> status = 1, signifie publié.

    function yourmodule_cron() {
      update $node->status = 1;    
    }
  3. Vous pouvez utiliser views_get_view () pour obtenir votre nid de noeud

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

Comment cibler les nœuds non publiés? Merci!
big_smile

Utilisez views_get_view () pour obtenir votre NID de nœud
Dong Tao

0

Que vous utilisiez une règle ou un code pour publier un seul nœud du haut de votre vue, je pense que la façon la plus simple de le planifier est d'utiliser Ultimate Cron .

Définissez le planificateur sur Crontab et pour la tâche spécifique, vous pouvez lui dire exactement quand vous voulez qu'il s'exécute. Par exemple, si vous voulez 8h, 12h et 16h, vous pouvez faire la règle:

0 8,12,16 * * *

Informations complémentaires:

Elysia Cron semble autoriser des tâches cron personnalisées, ce qui peut vous permettre de cibler une règle spécifique (peut-être via le code php).


avec Ultimate Cron est-il possible de déclencher une règle. J'ai essayé de jouer avec, mais je n'ai pas pu le comprendre. Les règles ne semblent pas pouvoir répondre à des tâches cron spécifiques (elles réagissent à toutes).
big_smile

Je ne le pensais pas, mais il semble qu'Elysia Cron pourrait vous permettre de créer des emplois personnalisés.
Darvanen

0

Créez une règle comme suit:

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

Créez un "ensemble d'actions": Nom = Annuler la publication des variables de contenu: Type de données = Node Label = Node Nom de la machine = node -Continue-

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

Dans / admin / config / workflow / rules Créez une "règle": Name = Unpublish Rule React on event = Node> Après avoir enregistré le nouveau contenu Restreindre par type = votre type de contenu -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-

En d'autres termes, il n'est pas nécessaire de filtrer le contenu lors de la création du composant ni d'ajouter une condition de type de contenu dans la règle.

De plus, vérifiez les paramètres cron de votre site Web dans Admin >> Configuration >> Système >> Cron (admin / config / system / cron)

Faites-moi savoir si vous rencontrez des questions / préoccupations à ce sujet.


Merci! Comment spécifier les heures auxquelles la règle doit s'exécuter? (Je veux seulement qu'il fonctionne à des moments précis). Comment puis-je obtenir qu'il publie un seul des nœuds dans ma liste Vues des nœuds non publiés?
big_smile
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.