我试图通过使用带有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文件,所以如果有人可以帮助我,那就太棒了。
答案 0 :(得分:1)
不要手动包含文件,使用标准wordpress Ajax API
答案 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_方式肯定更安全。