update_option not working in stand-alone PHP script

I have a standalone PHP script in my WordPress theme's directory that I run once every hour through a cron job (or manually if needed). All other WordPress functions are working except the update_option() function.

A simplified version of my script looks like this:

require_once('/path/to/site/wp-load.php');

$value = my_function();
update_option('my_option', $value);

and in one of my theme's files, I am running the following code:

echo get_option('my_option');

Nothing is printed, and a var_dump shows that the returned value is false.

My wp-admin/options.php page doesn't list my_option either.

I'm at a loss, because below those lines, I am using the following WordPress functions to interact with my WordPress database successfully:

  • get_posts
  • delete_post_meta
  • add_post_meta

Debugging my script, my_function returns a string (about 10 characters) and no errors are thrown with my PHP error settings at E_ALL.

Do I need to include other WordPress core files? I thought that wp-load.php was all you needed.


WordPress version: 3.7

Topic wp-load.php options Wordpress

Category Web


This is very old question but I will still comment on it. Now you have multiple options: WP-CLI should work in almost all of the cases. Another option is to create a custom plugin that hooks into 'init' event and it does something.


It sounds you need some kinda of bootstrap for your code. WordPress has already bootstrap such as index.php or wp-load.php or even wp-blog-header.php.

This :

require_once('/path/to/site/wp-load.php');

is not recommanded because path can be modified. What you can do to have some bootstrap is :

// Load WP
$load = 'wp-load.php';
while( !is_file( $load ) ) {
if( is_dir( '..' ) ) 
    chdir( '..' );
else
    die( 'Could not find WordPress in this place!');
}
require_once( $load );

In this way you'll be able to load WordPress almost in any case.


Add this two line in your file top

 $parse_uri = explode( 'wp-content', $_SERVER['SCRIPT_FILENAME'] );
 require_once( $parse_uri[0] . 'wp-load.php' );

It loads all of WordPress, but doesn't call wp() or invoke the template loader (used by themes) .


I'm not sure why it does't work for you, but the following works in the file wp-content/test.php:

<?php
// doesn't make difference to have this or not, for the rest to work
define( 'WP_USE_THEMES', false ); 

require( $_SERVER['DOCUMENT_ROOT'] .'/wp-load.php' );

function my_function()
{
    return 'hello world';
}

$value = my_function();
update_option( 'my_option', $value );
var_dump( get_option( 'my_option' ) );

About

Geeks Mental is a community that publishes articles and tutorials about Web, Android, Data Science, new techniques and Linux security.