How to initialize $wpdb?

I have a .php page in the theme root to check the data of one CUSTOM form.
After receiving this data I need to do a query in a custom mysql table, so I need $wpdb, but I can’t use it directly (or doing global $wpdb) because it is a phisical .php file, so the rewrite rule will not affect the request (the request is not passed to index.php because the file exists).

So In this case how can I create an object $wpdb?

Read More

Thanks

Related posts

Leave a Reply

5 comments

  1. First of all you probably created an isolated file that is not under the umbrella of WP files. That’s why you are not getting $wpdb. I guess you may not following the general rules/conventions of theme development. my question is now how are you accessing the file?

    whatever, if you include the wp_config.php in your file, you will get the $wpdb in your file.

    considering in a directory under themes directory, here is how you include/require the file

    require_once ('../../../wp-config.php');
    

    you may need to alter the path based on your system.

  2. require_once( 'path/to/wordpress/wp-includes/wp-db.php' );
    if ( file_exists( 'path/to/wordpress/wp-content/db.php' ) )
        require_once( 'path/to/wordpress/wp-content/db.php' );
    
    $wpdb = new wpdb( 'user', 'password', 'database', 'host' );
    

    To see how WordPress initialize it, see wp-includes/load.php, line 326.

  3. Excellent solution is:

    my_wpdb('test','pass',  'database', 'host', '../path/to/wp/');
    

    function

    function my_wpdb($user, $pass, $db, $host, $path_to_root= '/../../../../../../', $run_wp_config=true){
        $path_to_wp=  dirname(__DIR__) .$path_to_root;
      //execute wp-config, if not run already
        if($exec_config && !defined('DB_HOST')){    preg_match('/<?php(.*?)/* That's all, stop editing/si',  file_get_contents($path_to_root."wp-config.php"), $found);    eval($found[1]);    }
        require_once( $path_to_wp.'wp-includes/wp-db.php' );    if ( file_exists($path_to_wp.'wp-content/db.php' ) ) require_once($path_to_wp.'wp-content/db.php' );
        return $GLOBALS['wpdb'] = new wpdb( $user, $pass, $db, $host );
    }
    
  4. Since immediately after solving this issue begins a new one – where to PUT the initialization (it’s simple, but still if you don’t know this, you may do some nasty things instead – like trying to modify wp-db.php). The answer is kind of implicitly hidden in @sorich87’s answer, so just let’s add it here explicitly:

    Create db.php script in your ‘wp-content/’ folder.

    Also, for more clean initialization than just throwing around globals, see https://stackoverflow.com/a/5418972