Soporte » Guías – Resolución de problemas » Ejecutar funcion php en wp-cron

  • Resuelto jbulies

    (@jbulies)


    Estoy creando una tarea en el cron de **Wordpress** cada un minuto, para poner en contexto debo mencionar que: cree un tema hijo según lo especifica **Wordpress**, agregué un archivo nuevo .php llamado **prices.php** y lo declare en el **functions.php** de este tema hijo así include('prices.php'); y ahí tengo el siguiente código.

        // Exit if accessed directly.
        defined( 'ABSPATH' ) || exit;
        
        //Agregar nuevo intervalo de tiempo al cron de wp
        add_filter( 'cron_schedules', 'new_cron_interval' );
        function new_cron_interval( $schedules ) { 
            $schedules['one_minute'] = array(
                'interval' => 60,
                'display'  => esc_html__( 'Cada un minuto' ), );
            return $schedules;
        }
        
        //Agregar tarea al cron de wp
        if ( ! wp_next_scheduled( 'update_prices' ) ) {
            wp_schedule_event( time(), 'one_minute', 'update_prices' );
        }
        
        
        //Actualizar JSON local desde la API
        add_action( 'update_prices', 'update_prices' );
        
        function update_prices() {
        	define( 'ONLINE', 'https://api.coingecko.com/api/v3/simple/price?ids=bitcoin%2Cethereum%2Clitecoin%2Cdash%2Cdogecoin&vs_currencies=usd&include_market_cap=false&include_24hr_vol=false&include_24hr_change=false&include_last_updated_at=false');
        	if( $data_coingecko = @file_get_contents( ONLINE ) ) {
        		file_put_contents( 'prices.json', $data_coingecko );
        	}
        	else {
        		exit;
        	}
        }

    El tema hijo y la inclusión del nuevo archivo funcionan perfectamente, el nuevo intervalo de tiempo al cron y la tarea se crean correctamente, el problema es que la función no se ejecuta, simplemente no pasa nada cada un minuto.

    Para probar si mi función estaba correcta cree un archivo .php le escribí solo la función y una llamada y lo abrí directamente desde el navegador y efectivamente ahí si funciona.

        function update_prices() {
        	define( 'ONLINE', 'https://api.coingecko.com/api/v3/simple/price?ids=bitcoin%2Cethereum%2Clitecoin%2Cdash%2Cdogecoin&vs_currencies=usd&include_market_cap=false&include_24hr_vol=false&include_24hr_change=false&include_last_updated_at=false');
        	if( $data_coingecko = @file_get_contents( ONLINE ) ) {
        		file_put_contents( 'prices.json', $data_coingecko );
        		echo 'Funciona';
        	}
        	else {
        		echo 'NO Funciona';
        		exit;
        	}
        }
        
        update_prices();

    Espero haber sido claro en la explicación de mi problema.
    Gracias de antemano a quien pueda ayudar.

    • Este debate fue modificado hace 2 meses por jbulies.
    • Este debate fue modificado hace 2 meses por jbulies.
    • Este debate fue modificado hace 2 meses por jbulies.
Viendo 5 respuestas - de la 1 a la 5 (de un total de 5)
  • Buenas @jbulies

    Te recomiendo que utilices el plugin WPCrontol.
    https://es.wordpress.org/plugins/wp-crontrol/

    Con este podrás ver si el cron está correctamente configurado.

    Por dar otra opción, también podría ser que file_get_contents no tenga permisos para ser ejecutado desde CRON. (para evitar hackeos)

    A ver si con el plugin consigues ver si la función está bien conectada. Si no para comprobar si se ejecuta, ponle algo más sencillo que no implique la llamada a algo externo.

    Salut!

    Iniciador del debate jbulies

    (@jbulies)

    Hola @adriandegrafreak gracias por responder, ya tengo el plugin instalado y en el veo la tarea supuestamente ejecutándose correctamente cada 1 min, pero realmente no sucede nada. Después de mucho pensar lo único que se me ocurre es que wp-cron no funciona cuando el proyecto aun no está en linea y ese es mi caso, estoy desarrollando algo sobre wordpress pero todavía no esta en linea sino local.

    Aaaaa!!!

    Por supuesto que no se te está ejecutando. Mírate esto:

    Home

    Dice: WP-Cron does not run constantly as the system cron does; it is only triggered on page load.

    Si quieres que actue como un cron normal debes poner:
    define('DISABLE_WP_CRON', true);

    Y hacer la llamada al cron desde el servidor:
    wget --delete-after http://YOUR_SITE_URL/wp-cron.php

    Espero que esto te de un poco má de luz paa conseguir lo que quieres.
    Salut!

    Iniciador del debate jbulies

    (@jbulies)

    Hola @adriandegrafreak feliz año nuevo… eso es seguro, una ves que termine lo que estoy haciendo y lo suba a un host implementaré el cron del servidor, he leído mucho al respecto y todas las opiniones apuntan a que es lo mejor.

    Por otra parte, te comento algo curioso que quizás sirva a quien lea esto. Como las modificaciones en las que estoy trabajando son varias decidí crear un plugin e implementarlas todas ahí, incluyendo mi tarea del cron y la función a ejecutar, es exactamente el mismo código solo que ahora se ejecuta desde un plugin y NO desde functions.php del tema hijo donde anteriormente incluía el archivo.
    Y ahora la tarea si se ejecuta…

    Feliz año @jbulies,

    Etonces si ya se ejecuta, puedes marcarlo como completado. Tal vez la inclusión del archivo no se estaba haciendo correctamente desde el tema. Pero si ya funciona, estupendo!

    Salut!

Viendo 5 respuestas - de la 1 a la 5 (de un total de 5)
  • Debes estar registrado para responder a este debate.