如何在php脚本中正确包含WordPress的user.php?

时间:2015-04-11 19:03:39

标签: php ajax wordpress

我试图通过使用带有php脚本后端的ajax检查wordpress中是否有用户名,但不确定如何正确执行此操作。

checkusername.php脚本中,我像这样包含WordPress的user.php

require_once("../wp-includes/user.php");

我致电username_exists( $_POST["username"] )并接到以下错误:

Call to undefined function get_user_by() in ...\user.php on line 1613

注意我缩写了位置。如果我包含pluggable.php,我会收到类似错误,但

Class 'WP_User' not found in ...\pluggable.php on line 152

老实说,我真的不知道我应该如何正确使用wordpress pagetemplates之外的user.php文件,所以如果有人可以帮助我,那就太棒了。

4 个答案:

答案 0 :(得分:1)

不要手动包含文件,使用标准wordpress Ajax API

https://codex.wordpress.org/AJAX_in_Plugins

答案 1 :(得分:1)

如果你在WordPress中使用ajax,你不需要这样做"在外面" WordPress的。 WordPress拥有自己的过滤器挂钩系统,允许在完全访问所有WordPress功能的同时运行ajax回调函数。

看看这个: https://codex.wordpress.org/Plugin_API/Action_Reference/wp_ajax_%28action%29

以下是如何在WordPress中正确设置ajax回调的完整示例:

PHP代码(放在主题的插件或functions.php文件中)

//First enqueue your javascript in WordPress
function your_prefix_enqueue_scripts(){

    //Enqueue your Javascript (this assumes your javascript file is located in your plugin in an "includes/js" directory)
    wp_enqueue_script( 'your_unique_js_name', plugins_url('js/yourjavascriptfile.js', dirname(__FILE__) ), array( 'jquery' ) );

    //OR (simpler but not recommended)  
    wp_enqueue_script( 'your_unique_js_name', 'http://domain.com/myjavascriptfile.js', array( 'jquery' ) );

    //Here we create a javascript object variable called "youruniquejs_vars". We can access any variable in the array using youruniquejs_vars.name_of_sub_variable
    wp_localize_script( 'your_unique_js_name', 'youruniquejs_vars', 
        array(
            //To use this variable in javascript use "youruniquejs_vars.ajaxurl"
            'ajaxurl' => admin_url( 'admin-ajax.php' ),
        ) 
    );  

}
add_action( 'wp_enqueue_scripts', 'your_prefix_enqueue_scripts' );

//This is your Ajax callback function
function your_ajax_callback_function_name(){

    //Get the post data 
    $username = $_POST["username"];

    //Run any WordPress function you want in this ajax callback
    if ( username_exists( $username ) ){
        $array_we_send_back = array( 'message' => __( 'This user exists', 'textdomain' ) );
    }
    else{
        $array_we_send_back = array( 'message' => __( 'This user does not exist', 'textdomain' ) );
    }

    //Make sure to json encode the output because that's what it is expecting
    echo json_encode( $array_we_send_back );

    //Make sure you die when finished doing ajax output.
    die(); 

}
add_action( 'wp_ajax_' . 'your_ajax_callback_function_name', 'your_ajax_callback_function_name' );
add_action( 'wp_ajax_nopriv_' . 'your_ajax_callback_function_name', 'your_ajax_callback_function_name' );

然后这会出现在你的javascript文件中:

jQuery(document).ready(function($){

    /**
     * When your ajax trigger is clicked
     *
     */
    $( document ).on( 'click', '.my-button', function(event){

        event.preventDefault();

        // Use ajax to do something...
        var postData = {
            action: 'your_ajax_callback_function_name',
            username: 'test_username_1',
        }

        //Ajax load more posts
        $.ajax({
            type: "POST",
            data: postData,
            dataType:"json",
            url: youruniquejs_vars.ajaxurl,
            //This fires when the ajax 'comes back' and it is valid json
            success: function (response) {

                alert( response.message );

            }
            //This fires when the ajax 'comes back' and it isn't valid json
        }).fail(function (data) {
            console.log(data);
        }); 

    });

});

答案 2 :(得分:0)

如果您需要访问WordPress功能,则必须包含 wp-load.php

require_once("wp-contents/wp-load.php");

但这不是最佳做法,您不应直接加载文件。

相反,您可以按照kkarpieszuk的答案,按照如何使用WordPress ajax API的说明进行操作 (https://codex.wordpress.org/AJAX_in_Plugins

答案 3 :(得分:0)

如果您正在编写一个要分发到世界各地的插件,这些答案很好,并且您真的需要它与WordPress其他部分一起使用,并且您不关心性能即可。如果您的站点中有很多插件...特别是像BuddyPress这样的大插件,那么通过标准WP ajax管道运行ajax调用可能效率很低,因为所有插件都被加载和处理,并且init每个ajax调用的所有插件都会调用例程。来自非WordPress世界,这对我来说似乎很疯狂。 99%的ajax调用不需要设置所有基础设施来完成他们需要做的事情。

要避免这种情况,请设置ajax php页面以使用SHORTINIT代码,并在标题中加载所需的文件。 (另见:https://wordpress.stackexchange.com/questions/173002/how-declare-ajax-functions-ussing-shortinit

为了访问wpdb,get_current_user和check_ajax_referer,我使用了以下ajax页面的顶部:

N.B。我们的安装在/ wp文件夹中有wordpress,而不是根文件夹!您的路径名可能不同

下面的文件可能类似于/plugins/myplugin/my_ajax_event_handler.php ...它将直接从客户端javascript中的$ .ajax调用

<?php
define('SHORTINIT', true);

//IMPORTANT: Change with the correct path to wp-load.php in your installation
$path = $_SERVER['DOCUMENT_ROOT'];
include_once $path . '/wp/wp-load.php';
include_once $path . '/wp/wp-includes/wp-db.php';
include_once $path . '/wp/wp-includes/formatting.php';
include_once $path . '/wp/wp-includes/capabilities.php';
include_once $path . '/wp/wp-includes/session.php';
include_once $path . '/wp/wp-includes/user.php';
include_once $path . '/wp/wp-includes/meta.php';
include_once $path . '/wp/wp-includes/pluggable.php';
wp_cookie_constants( );
wp_plugin_directory_constants();

my_ajax_event_handler();
function my_ajax_event_handler() {
    global $wpdb;

    // A nonce should be passed in from the client in the post field "security"
    check_ajax_referer( 'my_ajax_event_handler', 'security' );

    ... do all my cool ajax stuff ...

    die();
}
?>

请注意,我在大型企业环境中工作,并且每当我们升级WordPress时,都会被迫做完升级代码的工作。这个方法适合我,但正常的wp_ajax_方式肯定更安全。