wp cron is not running my function
-
Hello there!
What I’m trying to achieve is to run a function every five minutes with a cron job. I’ve followed the docs about wp cron here. Everything seems to be all right, my recently created hook is on the list of cron jobs, but the thing is that my function never executes and I don’t know how to debug why is it happening.
When the function is attached to some other hook like
save_post
, it does executes and the expected result is achieved, so I think I can discard any errors in my function.Please, any advice on how to debug this will be appreciated.
Thanks in advance!
-
The WP cron is triggered by site visits. It won’t run unless someone visits a WP URL. If you need it to run on a fixed schedule, use a real cron on your server or one of the many external cron services.
Hi @joyously
Thank you for your response. Yes, I know that, actually I’ve disabled the WP cron due to my site having thousands of visits per hour, so instead I have a real cron that executes wp-cron.php every minute. Something like this:
* * * * * curl -vs -o -S https://mysite.com/wp-cron.php?doing_wp_cron > /home/mysite/logs/cronwp.log 2>&1
.So, is it in the way that you disabled WP cron? How can it be disabled, yet your cron job calling it should work?
Sorry i forgot to mention. The wp cron can be disabled adding this line to
wp-config.php
file:define('DISABLE_WP_CRON', true);
.AFAIK, by calling wp-cron with a real cron is just to ensure that the actual tasks get executed at a regular interval.
When I check for the jobs added to the cron with
wp cron event list
I can see that my task is added to the queue.Even I can execute it by running
wp cron event run custom_cron_hook
and the output isSuccess: Executed 1 task …
but still I don’t see that the function that should be called gets called, nor the file that should be created.
These are the relevant docs: https://developer.www.ads-software.com/plugins/cron/hooking-wp-cron-into-the-system-task-scheduler/
I’m pretty lost here, please be patient :\
@cubeinthebox Did you make any progress on this? I’m stuck at a similar place. The event is properly scheduled. But when it’s executed, nothing happens (or rather, the hook is never called). No errors in any log file, no complaints from any code. It’s just dead silent.
hi there @joho68
Unfortunately this didn’t work, so I ended up using a regular cron job on my server. I moved all the logic outside WordPress and just call the required the necessary core files to be able to call wp functions in my script. After that I only registered a new cron job with crontab and that was that!Thanks for getting back to me @cubeinthebox. I cannot for the life of me figure out what’s going on. WordPress goes through all the motions, but nothing happens. When the time is up for my scheduled event to be executed, WordPress renews the timer (“hourly”) properly, but the hooked function is not called, nor are any error messages logged.
Using the WP Cron Pixie plugin, I can see all the events/schedules, and everything looks as it should. I tried placing the hook to be executed outside of a class and just make it a global function, same result ??
I have exactly the same issue. Cron-job does not run automatically
– I tested with and without defining DISABLE_WP_CRON
– My event appears when I use ‘wp cron event list’
– My event runs when I use ‘wp cron event run my_event’
– I tried to enter in ‘https://mysite.com/wp-cron.php’ and nothing happens. Tested with ‘?doing_wp_cron’ and ‘?doing_wp_cron=1’ and nothing happens too.
– I put error_logs in ‘wp_cron’ functions… only write in there when I run my event trought CLI
– There is no HTTP Auth user/pass
– In local environment it works perfectly
– I installed WP Crontrol plugin. My event appears, but when I click in ‘run now’, nothing happens.
– I tested deactivating all plugins…. It does not work anywayAny ideas?
I have this same issue. I have disabled the wp-cron via the wp-config.php file. My cron job on my server calls the wp-cron.php, but none of my hooks are called.
EDIT:
My hooks are called, but “echo” statements and things sent to “php://output” are not seen on the screen when wp-cron.php is called manually via the browser nor are they sent to the log. I had to set up an SMS integration to verify that wp-cron.php was indeed executing the hooks.- This reply was modified 3 years, 8 months ago by ermWP.
I have the same issue.
- I’ve deactivated the default cron spawning by setting
DISABLE_WP_CRON
to true - I’ve made a cron job on the host which calls
wp_cron.php?doing_wp_cron
every minute. - The event appears in the cron list using the WP Crontrol plugin, and apparently runs. But there is no output, either to error log or saving an option.
- I’m able to run the job via WP-CLI, which reports that it has successfully run. But again, the action handler hasn’t done anything.
I’m able to make this work, so maybe it’s something to do with the way I’m adding the action handler.
add_action( 'init', function () { if ( ! wp_next_scheduled( 'do_single_action' ) ) { wp_schedule_single_event( time(), 'do_single_action' ); } add_action( 'do_single_action', 'do_this_once' ); function do_this_once() { error_log( 'DO THIS ONCE' ); } } );
- This reply was modified 3 years, 7 months ago by andfinally.
- This reply was modified 3 years, 7 months ago by andfinally.
In my case I was able to get it working by jiggling things round a bit. I added an
init
action at the root level of a file which is included byfunctions.php
:add_action( 'init', function () { if ( ! has_action( 'import_scheduled_job' ) ) { add_action( 'import_scheduled_job', 'Products\do_import', 10, 2 ); } } );
And added the action handler at the root level of a file which contained my import class, which calls the class’s import method.
namespace Products; class Product_Importer { // Other functions, including one which calls create_async_job // when the user starts an import private function create_async_job( $file ) { if ( ! wp_next_scheduled( 'import_scheduled_job' ) ) { wp_schedule_single_event( time(), 'import_scheduled_job', array( 'file' => $file, 'attachment_id' => $this->id ) ); } } public static function import( $file, $attachment_id ) { // ... } } function do_import( $file, $attachment_id ) { Product_Importer::import( $file, $attachment_id ); }
Not very elegant, but it does the job for now. Hope this helps other people with the same problem. I’m still not sure why I was getting this, but judging by the fix, I suspect it’s something to do with the scope of classes and/or namespaces.
One gotcha that might catch other people: you pass an
$args
array of parameters when you callwp_schedule_single_event
, but when the action handler is called, those params are passed individually. So if your array has two elements, specify 2 arguments in youradd_action
call.- This reply was modified 3 years, 7 months ago by andfinally.
@andfinally This looks like a solution. I’ll give it a try Thanks!!
So glad to hear that there’s a fix!! I’ve been having a nightmare with this!
WP newb here- would it be possible to run that code in 2 separate snippets in the code snippets plugin as a fix?
–Still getting to grips with WP
Hi @lauraabraham, I’m not too familiar with the Code Snippets plugin, but it looks like it should work just as well as if you’d added the code to your
functions.php
. You might even be able to combine them in one snippet.After long searching the solution of @andfinally got me on the right track. It was the hint about the namespacing, though it’s not a namespacing problem. But it got me thinking about instances ??
What happens:
-you go to a page
-the php script runs and creates instances of classes
-in add_action when you add your callback something like this:
add_action( ‘process_something’, [$this, ‘process_something’], 10, 3 );
-and then you call wp_schedule_single_event with this action
-then the script finishesThen later the WP Cron is executed. It’s a total different run of the script. The instance that was registered with the callback does not exist, so it can never be called.
So the add_action with the callback should indeed be registered in for example the init hook. Or anything that is also executed / instantiated when wp-cron runs. And then it can be perfectly fine in an instance of a namespaced class
- The topic ‘wp cron is not running my function’ is closed to new replies.