¿Cómo publicar nodos 3 veces al día?

8

Tengo una lista de nodos no publicados, creados con el módulo Vistas . Me gustaría que una tarea se ejecute 3 veces al día, a horas específicas. Cada vez que se ejecuta la tarea, solo se debe publicar uno de los nodos de la lista. ¿Cómo puedo hacer esto?

Pasos que he intentado

Programador

El módulo Programador requiere que especifique la hora exacta en que desea que se publique el nodo. Esto lo hace complicado, ya que tendría que resolver cuándo se supone que se publicará cada nodo.

Vistas Operaciones masivas + Reglas + Programador de reglas

Con el módulo de Operaciones masivas de Vistas , puede crear una lista de Nodos que están expuestos al módulo Reglas . Las reglas pueden actuar en la lista y publicar el nodo en la lista. Puede indicar a las Reglas que solo publiquen un número específico de nodos.

Esto funciona perfectamente Excepto que no parece posible programar la Regla para que se ejecute 3 veces al día.

Puede vincular la Regla al trabajo Cron del sitio principal, pero esto no parece muy preciso ya que el trabajo Cron podría ejecutarse más de 3 veces.

Hay un módulo de Programador de reglas (un submódulo de Reglas), pero no parece que pueda usar esta condición de Reglas. Tampoco parece haber una manera de especificar el tiempo de ejecución.

Programador de trabajos

Esto le permite establecer una hora, pero no parece integrarse con Reglas o Vistas .

gran sonrisa
fuente
¿Alguna razón por la que no quieres hacer esto a través de un módulo personalizado? Puedo darte una respuesta si quieres hacerlo de esta manera.
Aram Boyajyan
@Topsitemakers Esperaba usar un módulo existente, ya que habrá pasado a través de más usuarios, ¡será un código mejor que el mío! Tengo la impresión de que lo que quiero hacer es posible, ¡solo necesito ordenar un poco la programación de tareas!
big_smile

Respuestas:

5

Uso de módulos VBO, Reglas y Regulador de Horario

Acerca de su enfoque utilizando los módulos Vistas Bulk Operations (VBO) , Reglas y planificador de Reglas (submódulo de Reglas ), para el que escribió " no parece posible programar la Regla para que se ejecute 3 veces al día ": eso me parece Enfoque válido "a".

Lo que realmente necesita hacer es una variación menor de lo que se explica en el tutorial Tareas por hora utilizando el planificador de reglas : en su caso, debe usar un desplazamiento de 8 horas (en lugar de solo 1).

Y como se explica también en ese tutorial: inicialmente ejecute el componente manualmente. (a partir de entonces, cada 8 horas, la regla se ejecutará nuevamente).

Usar módulos Reglas y Reglas una vez al día

Hay un módulo bastante nuevo relacionado con las reglas, es decir, el módulo " Reglas una vez por día ". Así es como funciona (según el comentario en el número 2495775 , del propietario del módulo):

  • Usted especifica una hora de activación en la página de configuración de administración para este módulo.
  • El activador de regla se ejecutará cuando las tareas cron se ejecuten por primera vez después del inicio de esa hora . El tiempo de ejecución real dependerá de los tiempos de su tarea cron.

La forma en que entiendo / leo esto (aunque todavía no he experimentado con esto) es así:

  • El "Evento" solo se activará cuando se ejecute un trabajo cron.
  • Y ese evento solo se activará 1 vez / día, es decir, "la próxima vez que se ejecute cron después de que haya pasado la hora de activación".

Entonces, al crear 3 reglas similares, podría hacer que 1 de ellas corra alrededor de (digamos) 6 pm, otra alrededor de las 2 pm y la más rápida a las 10 pm

PD: Supongo que esta pregunta es sobre D7.

Pierre.Vriens
fuente
¿Cómo consigo que se ejecute al mismo tiempo? No parece haber una opción para activar una regla en un momento determinado.
big_smile
¿Está familiarizado con el módulo Reglas una vez al día? Consulte mi respuesta actualizada ... curiosidad por saber si eso podría funcionar ...
Pierre.Vriens
"Reglas una vez al día" solo se ejecuta una vez al día. Pero espero poder agregar un desplazamiento para obtener los tiempos que quiero. Reglas te permite usar stringtotime(). Si las "reglas una vez al día" se ejecutaran a medianoche y quisiera que mi regla se ejecutara a las 6 p.m., ¿ +18 hourssería la forma correcta de escribir el stringtotimecomando?
big_smile
Es cierto que las Reglas una vez al día solo se ejecutan una vez al día (como su nombre también indica). Pero si define 3 reglas (similares), entonces tiene 3 veces una vez al día, ¿verdad? Además, el desencadenante real será cuando se ejecute su trabajo cron. Digamos que cron se ejecuta cada hora, también a las 6:05 pm (18:05). Entonces su "hora de activación" debería ser un poco antes (como +18 horas), de modo que cuando se ejecute el siguiente cron (a las 18:05), obtenga el activador. Si su cron también se ejecuta a (por ejemplo) 12:05 y 04:05, debe tener otra regla con la hora de activación como +12 horas y otra más como +4 horas.
Pierre.Vriens
1
Aunque solo he probado esto en un 90%, es la respuesta que ha funcionado mejor hasta ahora, por lo que obtiene la recompensa.
big_smile
1

Puede lograr esto usando un poco de codificación.

  1. Una vista que enumera todos los nodos que se publican para la programación. Si también aplica DraggableViews , puede permitir a los administradores reordenar los nodos arrastrando y soltando, lo que siempre es bueno.

  2. Una función PHP personalizada publishdaily_get_top_node()que ejecuta la vista anterior y devuelve el NID para el nodo superior. Recomendaría poner esto en un mini módulo personalizado.

  3. Una regla que se activa en la ejecución cron y comprueba si es hora de publicar un nuevo nodo (por ejemplo, verificando si el tiempo está entre 00.00 y 00.15, dependiendo de la frecuencia con la que se ejecuta su cron). Si es el momento, entonces dispara la acción 'nodo de carga' y usa publishdaily_get_top_node()para cargar el NID. Luego publica el nodo cargado.

Si desea hacerlo aún más limpio, escriba un complemento de Reglas en lugar de solo una función PHP.

Si lo desea menos limpio, escriba la función directamente en una acción para ejecutar código PHP arbitrario.

Referencia

rfegade
fuente
checking if the time is between 00.00 and 00.15¿Cómo verificaría el tiempo en las reglas? Gracias.
big_smile
puede usar un planificador de reglas o un planificador de trabajos
rfegade
¡Bienvenido a Drupal Answers! Si va a copiar y pegar una respuesta, vuelva a vincular la publicación original.
kiamlaluno
1
  1. Configuración de trabajos cron utilizando el comando cron en los momentos especificados que desee.

  2. Cree un módulo para implementar hook_cron (). Para actualizar su primer nodo como $node->status = 1.

    $ nodo-> estado = 0, significa no publicado.
    $ nodo-> estado = 1, significa publicado.

    function yourmodule_cron() {
      update $node->status = 1;    
    }
  3. Puede usar views_get_view () para obtener su nid de nodo

    $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    
    
    }
Dong Tao
fuente
¿Cómo apunto a los nodos no publicados? ¡Gracias!
big_smile
Use views_get_view () para obtener su NID de nodo
Dong Tao
0

Ya sea que use una regla o código para publicar un solo nodo desde la parte superior de su vista, creo que la forma más fácil de programarlo es usar Ultimate Cron .

Establezca el programador en Crontab y para la tarea específica puede decirle exactamente cuándo desea que se ejecute. Por ejemplo, si quieres 8am, 12 del mediodía y 4pm, puedes hacer la regla:

0 8,12,16 * * *

Más información:

Elysia Cron parece permitir tareas cron personalizadas, que pueden permitirle apuntar a una regla específica (tal vez a través del código php).

Darvanen
fuente
con Ultimate Cron es posible activar una regla. Intenté jugar con él, pero no pude resolverlo. Las reglas no parecen ser capaces de responder a trabajos cron específicos (reacciona a todos ellos).
big_smile
No lo creo, pero parece que Elysia Cron podría permitirte crear trabajos personalizados.
Darvanen
0

Cree una regla de la siguiente manera:

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

Cree un "conjunto de acciones": Nombre = No publicar variables de contenido: Tipo de datos = Etiqueta de nodo = Nodo Nombre de máquina = nodo -Continuar-

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

En / admin / config / workflow / rules Cree una "regla": Nombre = Regla no publicada Reaccionar en evento = Nodo> Después de guardar contenido nuevo Restrinja por tipo = su tipo de contenido -Guardar-

    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-

Es decir, no es necesario filtrar el contenido al crear el componente ni agregar una condición de tipo de contenido en la regla.

Además, verifique la configuración cron de su sitio web desde Admin >> Configuración >> Sistema >> Cron (admin / config / system / cron)

Avíseme si tiene alguna pregunta o inquietud al respecto.

AddWeb Solution Pvt Ltd
fuente
¡Gracias! ¿Cómo especifico los momentos en que se debe ejecutar la regla? (Solo quiero que se ejecute en momentos específicos). ¿Cómo consigo que publique solo uno de los nodos en mi lista de Vistas de nodos no publicados?
big_smile