Cron tasks
-
@girish Here I send you the screenshot of the terminal after sending those commands:
Running it like this did not make the plugin work.
The plugin cron task is this:
When the cron executes this task it gives me this error:
Is there any other way to execute that task? I have to get that plugin working. The plugin people don't know what's going on because our cloudron server is something special
-
@girish The plugin is optimizador.io (https://optimizador.io/)
Right now I edit the links of the screenshots and upload the images directly.
-
-
@mdreira It seems that global variables are not working. The clue is from this error message:
WordPress database error Table 'c801e5ebba2fb24b.wp_' doesn't exist for query SELECT * FROM wp_ WHERE meta_id = 6 AND thumb_size = 'we_original_size' ORDER BY time DESC made by include('phar:///app/pkg/wp/php/boot-phar.php'), include('phar:///app/pkg/wp/vendor/wp-cli/wp-cli/php/wp-cli.php'), WP_CLI\bootstrap, WP_CLI\Bootstrap\LaunchRunner->process, WP_CLI\Runner->start, WP_CLI\Runner->run_command_and_exit, WP_CLI\Runner->run_command, WP_CLI\Dispatcher\Subcommand->invoke, call_user_func, WP_CLI\Dispatcher\CommandFactory::WP_CLI\Dispatcher\{closure}, call_user_func, Cron_Event_Command->run, Cron_Event_Command::run_event, do_action_ref_array('my_schedule_hook'), WP_Hook->do_action, WP_Hook->apply_filters, oiwe_my_schedule_function, oiwe_optimize_concurrent_image_by_att_id, oiwe_isOptimized
The relevant code is:
function oiwe_get_optimization_data_by_attID($id){ global $wpdb; global $OIWE_TABLENAME; $table_name = $wpdb->prefix . $OIWE_TABLENAME ; $querystr = " SELECT * FROM $table_name WHERE meta_id = $id AND thumb_size = 'we_original_size' GROUP BY uuid ORDER BY time DESC "; $optimizations = $wpdb->get_results($querystr, OBJECT); return $optimizations ; }
In the above,
OIWE_TABLENAME
isnull
. In fact, all the globals in that file are "null" which is why we later get the error that string is expected. My PHP skillz are being put to test... -
So strange, I cannot figure why this is. There is a constants.php in the plugin. I put the logs below:
<?php $OIWE_API_URL = "http://apiv1.optimizador.io:80/"; global $OIWE_API_URL ; $PLUGIN_VERSION = "1.0.22"; error_log('The version is ' . $PLUGIN_VERSION); global $PLUGIN_VERSION; error_log('The version is now ' . $PLUGIN_VERSION); $OIWE_TABLENAME = "imgoptimizations"; global $OIWE_TABLENAME;
Now, if I run via PHP cli:
root@d2c84f40-ba29-47fd-87a5-48c873006e89:/app/data# php /app/data/public/wp-content/plugins/weimgoptimizer/includes/constants.php The version is 1.0.22 The version is now 1.0.22
So, the above works as expected. But if I now run this via WP CRON:
root@d2c84f40-ba29-47fd-87a5-48c873006e89:/app/code# sudo -u www-data -i -- /app/pkg/wp --path=/app/data/public/ cron event run my_schedule_hook The version is 1.0.22 The version is now
The version is empty for the second one! In fact, all the global things like
global $PLUGIN_VERSION;
in constants.php become immediately empty . FWIW, theglobal
usage above seems to be incorrect. In PHP AFAIK,global
is to declare that you are going to use a global variable and not that a variable has to become global. -
@mdreira OK, I found the issue. The usage of
global
is incorrect in the plugin. Theglobal
keyword is for stating the use of a global variable (as opposed to 'make this variable global').With that in mind, the code in the plugin's constant.php is like this:
<?php $OIWE_API_URL = "http://apiv1.optimizador.io:80/"; global $OIWE_API_URL ;
The above code will break when the above file is included from a "function". This is the case when we use WP CLI where entire WordPress is loaded into a function. So, for example, the rough equivalent is:
function load() { require_once(".../constants.php"); }
When it's like above, the
global $OIWE_API_URL
keyword then says, useOIWE_API_URL
from global context, which is not the same as the one you defined one line above (it's a function local variable). So, the solution is to move the global keyword before setting it in constants.php. Like this:global $OIWE_API_URL ; $OIWE_API_URL = "http://apiv1.optimizador.io:80/"; // .. do same for other constants in the file ..
Of course, this is why globals are not used in WP plugins. You should use superglobals like $GLOBAL or define or database etc. See https://codex.wordpress.org/Global_Variables and https://onlinewebtutorblog.com/wordpress-global-variables-step-by-step-complete-guide/
-
-
@mdreira said in Cron tasks:
@girish Then.. what should I do?.
Sorry, I wasn't clear. Please send the plugin authors the link to my comment. There is nothing we can do, they have to fix the plugin. They can easily reproduce this by running cron tasks using the WP CLI tool outside Cloudron. WP CLI is pretty much part of standard WP - https://make.wordpress.org/cli/handbook/
-
@girish Just one more question. I guess the problem with global variables is not only in constants.php file, right? Surely there are several files that are involved...
I'm saying this, because I've repositioned the variables in constants.php file like you said, and it still doesn't work.