[wp-hackers] "deprecating" direct calls to wp-config.php

Jason Benesch jason at realestatetomato.com
Tue Nov 3 17:53:40 UTC 2009


Wordpress now has a 'wp_ajax_nopriv_my_action' in 2.8 for your ajax calls
but following up with what Otto wrote about the template_redirect, here is a
quick example of a way you could go about making ajax requests without
having to call wp-load directly from one of your external script files.
Someone please correct me if you see anything off:


Let's say your plugin name is incredible ajax or inc_ajax

// Create some extra variables to accept when passed through the url
function my_query_vars( $query_vars ) {
    $myvars = array( 'inc_ajax' );
    $query_vars = array_merge( $query_vars, $myvars );
    return $query_vars;
}
add_filter( 'query_vars', 'my_query_vars' );

// Flush your rewrite rules if you want pretty permalinks
function flush_rewrite_rules() {
    global $wp_rewrite;
    $wp_rewrite->flush_rules();
}
add_action( 'init', 'flush_rewrite_rules' );

// Create a rewrite rule if you want pretty permalinks
function add_rewrite_rules( $wp_rewrite ) {
    $wp_rewrite->add_rewrite_tag( "%inc_ajax%", "(.+?)", "inc_ajax=" );

    $urls = array( 'ajax/%inc_ajax%' );
    foreach( $urls as $url ) {
        $rule = $wp_rewrite->generate_rewrite_rules($url, EP_NONE, false,
false, false, false, false);
        $wp_rewrite->rules = array_merge( $rule, $wp_rewrite->rules );
    }
    return $wp_rewrite;
}
add_action( 'generate_rewrite_rules', 'add_rewrite_rules' );

// Let's echo out the content we are looking to dynamically grab before we
load any template files
function ajax_template() {
    global $wp, $wpdb;
    if( isset( $wp->query_vars['inc_ajax'] ) && !empty(
$wp->query_vars['inc_ajax'] ) ) {
        switch( $wp->query_vars['inc_ajax'] ) {
            case 'all_users':
                $all_users = $wpdb->get_results("SELECT * FROM
{$wpdb->users}");
                echo json_encode($all_users);
                exit;
            break;
            case 'some_users':
                $some_users = $wpdb->get_results( $wpdb->prepare( "SELECT *
FROM {$wpdb->users} WHERE id = %s", $_POST['user_id'] ) );
                echo json_encode($some_users);
                exit;
            break;
            default:
                echo 'You really shouldn't be here...';
                exit;
            break;
        }
    }
}
add_action( 'template_redirect', 'ajax_template' );




So now from your theme file, here is an example of an ajax request using
jQuery:

jQuery(function($) {
    $('#some_button').click(function(){
        $.post( "http://mywpdomain.com/ajax/all_users",
            function( data ) {
                console.log(data);
            }, json );
    });
});


My point being, you now have created an ajax request url for your blog.

You can obviously elaborate on this and you should probably use the WP
'wp_ajax_nopriv_my_action' action hook in 2.8...

But this is just an example of how you could avoid using loading the
wp-load, or wp-config from external scripts in your plugin.

Hope it helps sombody!




On Tue, Nov 3, 2009 at 9:05 AM, Otto <otto at ottodestruct.com> wrote:

> On Tue, Nov 3, 2009 at 9:43 AM, Claudio Simeone <mrbrog at gmail.com> wrote:
> > what's the reason, in details, of discouraging direct calls of
> > wp-config.php (or similar of wp-load.php)?
> > Sometimes I include wp-load.php in scripts external to WP, so I can
> > use e.g., database functions etc in those scripts.
> > Is that correct, or is to be discouraged, and if so, what is the
> > correct way to use WP environment in external scripts?
>
> The correct way depends on what exactly you're doing. However, there's
> never any real reason to include wp-config or wp-load directly. Doing
> so is.. not wrong, exactly... just a bit sloppy. It's error-prone,
> more likely to break things.
>
> If you're doing AJAX like requests and need access to WordPress
> functions, then you could use techniques similar to these:
> http://codex.wordpress.org/AJAX_in_Plugins
>
> For most anything else, hooking into the template_redirect function to
> produce your custom output is the better way to go.
>
> -Otto
> _______________________________________________
> wp-hackers mailing list
> wp-hackers at lists.automattic.com
> http://lists.automattic.com/mailman/listinfo/wp-hackers
>



-- 
Jason Benesch

Real Estate Tomato
Co-owner
www.realestatetomato.com
(619) 770-1950
jason at realestatetomato.com

ListingPress
Owner, Founder
www.listingpress.com
(619) 955-7465
jason at listingpress.com


More information about the wp-hackers mailing list