Verifique se a função chamada pelo trabalho cron

12

Eu tenho uma função que eu só quero executar através de um trabalho cron. Existe uma maneira de verificar se um determinado evento agendado está chamando essa função e não qualquer outra coisa?

urok93
fonte
3
Btw: Você não recebe recompensa de volta se não for recompensado. Como você já marcou uma resposta como solução, forneça também ao usuário a recompensa. Obrigado.
Kaiser #

Respostas:

17

WordPress tem uma constante DOING_CRON que nos ajuda a saber que estamos fazendo os trabalhos cron ou não. Está definido no wp-cron.phparquivo.

Portanto, você pode verificar essa constante no seu código:

if ( defined( 'DOING_CRON' ) )
{
    // Do something
}
Anh Tran
fonte
2
A partir do WordPress 4.8.0, wp_doing_cron()pode ser usado.
Joe
2

Basta dar uma olhada no »Cron API inspector« , que escrevi para a pergunta # 18017 . O plug-in cria uma tabela que é mostrada no shutdowngancho / no final da página.

Ele usa a _get_cron_array()função para recuperar todas as ações registradas e agendadas. Outra função útil é wp_get_schedules(). A terceira maneira é chamar _get_cron_array()diretamente os dados subjacentes , chamando get_option( 'cron' );- ainda é melhor usar as funções padrão da API do núcleo do WP.

Se você deseja saber se está atualmente em um Cron Job, pode verificar defined( 'DOING_CRON' ) AND DOING_CRON.

kaiser
fonte
1

Não estou estudando desenvolvimento (sou apenas um entusiasta), mas acho que você pode adicionar um add_action ao evento

É apenas um currículo ...

//to the event
if(your_condition)
{
    add_action('original_event_to_hook', 'your_scheduled');
}

function your_scheduled()
{
    //create a param here
    //And shedule your function with arg
    wp_schedule_event(time(), 'hourly', 'your_function', array('param_1' => value));
}

function your_function($args){

   $verification = $args['param_1'];
   if($verification)
   {
      //OK
      //Eventually delete this schedule with this specific arg
   }
}

Para recuperar uma lista do seu cron "sua_função", onde está este argumento

     //Get a filtered list of cron hooks 
        function kw_filter_crons_hooks($hooks = false, $args = false)
        {
            $crons = get_option('cron');

            if (!$crons)
            {
                $crons[0] = NULL;
            }

            $filter = array();
            $cronlist = array();
            $schedule = array();

            foreach($crons as $timestamp => $cron)
            {
                //@param $hooks = string 'schedule'
                //@param $args = false
                //Return an array of cron task sheduled
                $schedule[] = $cron;

                if(!$schedule && $hooks == 'schedule' && $args == false)
                {
                    $schedule[0] = NULL;
                }

                foreach($hooks as $hook)
                {
                    if(isset($cron[$hook]))
                    {
                        //@param $hooks = array($hook);
                        //@param $args = false
                        //Return an array of cron task sheduled
                        $cronlist[] = $cron;

                        if(!$cronlist && is_array($hooks) && $args == false)
                        {
                            $cronlist[0] = NULL;
                        }

                        if(!empty($args))
                        {
                            foreach($cronlist as $key => $value)
                            {
                                foreach($value as $k => $v)
                                {
                                    foreach($v as $x => $y)
                                    {
                                        foreach($args as $arg => $val)
                                        {
                                            if ($y['args'][$arg] == $val)
                                            {
                                                //@param $hooks = array($hook);
                                                //@param $args = array($arg);
                                                //Return an array of cron task specified filtered by arg
                                                $filter[$x] = $y;
                                                if(!$filter && is_array($hooks) && is_array($args))
                                                {
                                                    $filter[0] = NULL;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }


            if(is_array($hooks) && $args === false && $cronlist)
            {
                return $cronlist;
            }
            else if(is_array($hooks) && is_array($args) && $filter)
            {
                return $filter;
            }
            else if($hooks === 'schedule' && $args === false && $schedule)
            {
                return $schedule;
            }
            else if($hooks === false && $args === false && $crons)
            {
                return $crons;
            }
            else
            {
                return false;
            }
        }

//Usage
    $cron_filtered = kw_filter_crons_hooks(array('your_function'), array('param_1' => value));
    var_dump($cron_filtered);
MonkeyTime
fonte