Como publicar nós 3 vezes por dia?

8

Eu tenho uma lista de nós não publicados, criados com o módulo Views . Eu gostaria que uma tarefa fosse executada 3 vezes ao dia, em horários especificados. Sempre que a tarefa é executada, apenas um dos nós da lista deve ser publicado. Como posso fazer isso?

Etapas que tentei

Agendador

O módulo Agendador requer que você especifique a hora exata em que você deseja que o nó seja publicado. Isso torna tudo complicado, pois eu teria que resolver quando cada nó deveria ser publicado.

Exibições Operações em massa + Regras + Agendador de regras

Com o módulo Views Bulk Operations , você pode criar uma lista de nós expostos ao módulo Rules . As regras podem agir na lista e publicar o nó na lista. Você pode dizer ao Regras para publicar apenas um número específico de nós.

Isso funciona perfeitamente. Exceto, não parece possível agendar a regra para executar três vezes por dia.

Você pode vincular a regra ao trabalho Cron do site principal, mas isso não parece muito preciso, pois o trabalho Cron pode ser executado mais de 3 vezes.

Existe um módulo Agendador de regras (um submódulo de regras), mas não parece que você possa usar essa condição. Também não parece haver uma maneira de especificar o tempo de execução.

Job Scheduler

Isso permite que você defina um horário, mas parece não se integrar às Regras ou Exibições .

grande sorriso
fonte
Algum motivo para você não querer fazer isso através de um módulo personalizado? Posso fornecer uma resposta, se você quiser fazer dessa maneira.
Aram Boyajyan # 26/15
@Topsitemakers Eu esperava usar um módulo existente, pois ele passou por mais usuários, portanto, haverá um código melhor que o meu !. Tenho a impressão de que o que eu quero fazer é possível, só preciso classificar o agendamento de tarefas!
Big_smile 26/05

Respostas:

5

Usando os módulos VBO, Rules and Rules Scheduler

Sobre a sua abordagem usando módulos Visualizações Granel Operações (VBO) , Normas e Regras programador (submodule de Regras ), para o qual você escreveu " não parece possível agendar a regra para executar 3 vezes por dia. ": Que me parece "uma" abordagem válida.

O que você realmente precisa fazer é uma pequena variação do explicado no tutorial Tarefas por hora usando o planejador de regras : no seu caso, você deve usar um deslocamento de 8 horas (em vez de apenas 1).

E como explicado também nesse tutorial: Execute o componente manualmente manualmente. (a partir de então, a cada oito horas, a regra será executada novamente).

Usando módulos Regras e regras uma vez por dia

Existe um módulo relativamente novo relacionado a regras, ou seja, o módulo " Regras uma vez por dia ". Aqui está como ele funciona (conforme o comentário no número 2495775 , do proprietário do módulo):

  • Você especifica uma hora de acionamento na página de configurações de administração para este módulo.
  • O acionador de regra será executado quando as tarefas cron forem executadas pela primeira vez após o início daquela hora . O tempo de execução real dependerá dos tempos de sua tarefa cron.

A maneira como eu entendo / Leia isso (ainda não experimentei isso) é assim:

  • O "Evento" será acionado apenas quando um trabalho cron for executado.
  • E esse evento será acionado apenas 1 vez / dia, ou seja, "da próxima vez que o cron for executado após a hora do acionador".

Portanto, ao criar três regras semelhantes, você pode ter 1 delas rodando (digamos) 18h, outra por volta das 14h e a mais alta às 22h.

PS: Estou assumindo que esta pergunta é sobre D7.

Pierre.Vriens
fonte
Como faço para rodar ao mesmo tempo. Não parece haver uma opção para ativar uma regra em um determinado momento.
Big_smile 27/05
Você conhece o módulo Regras uma vez por dia? Consulte a minha resposta atualizado ... curioso para ouvir se esse trabalho culd ...
Pierre.Vriens
"Regras uma vez por dia" é executado apenas uma vez por dia. Mas espero poder adicionar um deslocamento para obter os horários desejados. Regras permite que você use stringtotime(). Se "regras uma vez por dia" fosse executada à meia-noite e eu desejasse que minha regra fosse executada às 18h, seria +18 hoursa maneira correta de escrever o stringtotimecomando?
big_smile
É verdade que as regras uma vez por dia são executadas apenas uma vez por dia (como o nome também indica). Mas se você definir três regras (semelhantes), terá três vezes uma vez por dia, certo? Além disso, o gatilho real será quando o seu trabalho cron for executado. Digamos que o cron seja executado a cada hora, também às 18:05 (18:05). Então a sua "hora do gatilho" deve ser um pouco antes disso (como 18 horas), para que, quando o próximo cron for executado (às 18:05), você obtenha o gatilho. Se o seu cron também rodar às 12h05 e 04h05, você deve ter outra regra com hora de disparo como +12 horas e outra como +4 horas.
Pierre.Vriens
11
Embora eu tenha apenas 90% testado isso, é a resposta que melhor funcionou até agora, então obtém a recompensa.
big_smile
1

Você pode conseguir isso usando alguma codificação.

  1. Uma exibição que lista todos os nós publicados para agendamento. Se você também aplicar o DraggableViews, poderá permitir que os administradores reordenem os nós arrastando e soltando, o que é sempre bom.

  2. Uma função PHP customizada publishdaily_get_top_node()que executa a visualização acima e retorna o NID para o nó superior. Eu recomendaria colocar isso em um mini-módulo personalizado.

  3. Uma regra que é acionada na execução do cron e verifica se é hora de publicar um novo nó (por exemplo, verificando se o tempo está entre 00.00 e 00.15 - dependendo da frequência com que o seu cron é executado). Se estiver na hora, ele aciona a ação 'load node' e usa publishdaily_get_top_node()para fazer o NID carregar. Em seguida, ele publica o nó carregado.

Se você quiser torná-lo ainda mais limpo, escreva um plug-in Rules em vez de apenas uma função PHP.

Se você quiser menos limpeza, escreva a função diretamente em uma ação para executar código PHP arbitrário.

Referência

rfegade
fonte
checking if the time is between 00.00 and 00.15Como você verificaria o tempo nas regras? Obrigado.
big_smile
você pode usar um agendador regra ou Job Scheduler
rfegade
Bem-vindo ao Drupal Answers! Se você deseja copiar e colar uma resposta, vincule a postagem original de volta.
kiamlaluno
1
  1. Configurando tarefas cron usando o comando cron em horários especificados que você desejar.

  2. Crie um módulo para implementar hook_cron (). Para atualizar seu primeiro nó como $node->status = 1.

    $ node-> status = 0, significa não publicado.
    $ node-> status = 1, significa publicado.

    function yourmodule_cron() {
      update $node->status = 1;    
    }
  3. Você pode usar views_get_view () para obter seu nó 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    
    
    }
Dong Tao
fonte
Como faço para segmentar os nós não publicados? Obrigado!
big_smile
Use views_get_view () para obter o NID do seu nó
Dong Tao
0

Se você usa uma regra ou código para publicar um único nó da parte superior da sua exibição, acredito que a maneira mais fácil de agendá-lo é usar o Ultimate Cron .

Defina o planejador como Crontab e, para a tarefa específica, você pode dizer exatamente quando deseja que seja executado. Por exemplo, se você quiser 08:00, 12:00 e 16:00, pode fazer a regra:

0 8,12,16 * * *

Outras informações:

O Elysia Cron parece permitir tarefas cron personalizadas, o que pode permitir que você direcione uma regra específica (talvez via código php).

Darvanen
fonte
com Ultimate Cron é possível disparar uma regra. Tentei brincar com ele, mas não consegui descobrir. As regras não parecem capazes de responder a tarefas cron específicas (reagem a todas elas).
big_smile
Acho que não, mas parece que o Elysia Cron pode permitir que você crie trabalhos personalizados.
precisa saber é o seguinte
0

Crie uma regra da seguinte maneira:

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

Crie um "conjunto de ações": Nome = Cancelar publicação de variáveis ​​de conteúdo: Tipo de dados = Nó Rótulo = Nó Nome da máquina = nó -Continuar-

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

Em / admin / config / workflow / rules Crie uma "regra": Nome = Cancelar publicação da regra Reagir no evento = Nó> Após salvar o novo conteúdo Restringir por tipo = seu tipo de conteúdo -Salvar-

    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-

Ou seja, não é necessário filtrar o conteúdo ao criar o componente nem adicionar uma condição de tipo de conteúdo à regra.

Além disso, verifique a configuração do cron do site em Admin >> Configuração >> Sistema >> Cron (admin / config / system / cron)

Deixe-me saber se você tiver alguma dúvida / preocupação sobre isso.

AddWeb Solution Pvt Ltd
fonte
Obrigado! Como especifico os horários em que a regra deve ser executada? (Eu só quero que ele seja executado em horários específicos). Como faço para publicar apenas um dos nós na minha lista de nós não publicados do Views?
big_smile