javascript - WordPress 自定义插件开发中的纯 JavaScript 基本 AJAX 调用
问题描述
我正在开发一个自定义 WordPress 插件,其中我在主插件页面上有一些 HTML 表单,在后页中有一些 PHP 功能,比如从数据库中获取信息等。要详细解释,这里是代码.. .
主插件文件:
<?php
/*
Plugin Name: WP Testing Plugin
Plugin URI: http://www.wordpress.org/WP-Testing-Plugin
Description: A Detailed Description About This Plugin.
Author: Muhammad Hassan
Version: 0.1
Author URI: http://www.wordpress.org
*/
/*____________WP Testing Plugin Admin/Script_____________*/
function wp_testingPlugin_admin() {
echo '
<form id="searchForm" onsubmit="return searchData(this)">
<input name="WhatToSearch" type="text" />
<input type="submit" value="Search"/>
<input type="reset" value="Reset"/>
<div id="showReturnData"></div>
</form>
';
echo '
<script type="text/javascript">
function searchData(incomingForm) {
// Confirmation To Add A Data
var answer = confirm("Are You Sure Want To Search?");
if (answer){
// If User Click Ok Then Execute The Below Code
var FD = new FormData(incomingForm); // Get FORM Element Object
FD.append("Function", "SearchFunction"); // Adding Extra Data In FORM Element Object To Hit Only This Function In Ajax Call File
var ajx = new XMLHttpRequest();
ajx.onreadystatechange = function () {
if (ajx.readyState == 4 && ajx.status == 200) {
document.getElementById("showReturnData").innerHTML = ajx.responseText;
}
};
ajx.open("POST", "'.plugin_dir_url( __FILE__ ).'my_functions.php", true);
ajx.send(FD);
document.getElementById("showReturnData").innerHTML = "<div class="error">ERROR: AJAX Did Not Respond.</div>";
}
return false; // For Not To Reload Page
}
</script>
';
//if you want only logged in users to access this function use this hook
add_action('wp_ajax_ACTION_NAME', 'searchData');
//if you want none logged in users to access this function use this hook
add_action('wp_ajax_nopriv_ACTION_NAME', 'searchData');
}
/*__________________________________________________________________*/
/*____________WP Testing Plugin Option_____________*/
//Adding "WP Testing Plugin" Menu To WordPress -> Tools
function wp_testingPlugin() {
// add_management_page( $page_title, $menu_title, $capability, $menu_slug, $function); Menu Under Tools
add_management_page("WP Testing Plugin By Hassan", "WP Testing Plugin", 'activate_plugins', "WP-Testing-Plugin", "wp_testingPlugin_admin");
}
add_action('admin_menu', 'wp_testingPlugin');
/*__________________________________________________________________*/
?>
这是my_functions.php文件。
<?php
/****************************************************************************/
//Garb The Function Parameter
/****************************************************************************/
$Function = $_POST['Function'];
/****************************************************************************/
// Run Search Function
/****************************************************************************/
if ($Function == "SearchFunction"){
if(!isset($_POST['WhatToSearch'])){
$WhatToSearch = "Nothing";
} else {
$WhatToSearch = $_POST['WhatToSearch'];
}
echo "<div class='success'>SUCCESS: Function Is Working Perfectly And Getting Data ".$WhatToSearch.".</div>";
}
/****************************************************************************/
// Run Another Function
/****************************************************************************/
if ($Function == "AnotherFunction"){
echo "<div class='success'>SUCCESS: Another Function Is Working Perfectly.</div>";
}
?>
但是我的代码不起作用,甚至没有点击 my_functions.php 文件。这里有什么问题?只需基本步骤即可在此模式下工作。
解决方案
最后在获得thaikolja的帮助后,我在这里以简单的步骤分享我的问题的完整工作示例。这个答案也被认为是一个完整的基本 Ajax 插件示例。我现在个人建议将每个文件分开,以获得更好、干净和舒适的编码......
主插件文件:
<?php
/*
Plugin Name: WP Testing Plugin
Plugin URI: http://www.wordpress.org/WP-Testing-Plugin
Description: A Detailed Description About This Plugin.
Author: Muhammad Hassan
Version: 0.1
Author URI: http://www.wordpress.org
*/
// Calling All PHP File To Load
include('my_functions.php');
/*____________WP Testing Plugin Admin/Script_____________*/
function wp_testingPlugin_admin() {
echo '
<form id="searchForm">
<input name="WhatToSearch" type="text" />
<input type="submit" value="Search"/>
<input type="reset" value="Reset"/>
<div id="showReturnData"></div>
</form>
';
}
/*__________________________________________________________________*/
/*____________WP Testing Plugin Option_____________*/
//Adding "WP Testing Plugin" Menu To WordPress -> Tools
function wp_testingPlugin() {
// add_management_page( $page_title, $menu_title, $capability, $menu_slug, $function); Menu Under Tools
add_management_page("WP Testing Plugin By Hassan", "WP Testing Plugin", 'activate_plugins', "WP-Testing-Plugin", "wp_testingPlugin_admin");
}
add_action('admin_menu', 'wp_testingPlugin');
/*__________________________________________________________________*/
?>
my_functions.php
<?php
add_action( 'admin_enqueue_scripts', 'my_enqueue' );
function my_enqueue() {
wp_enqueue_script( 'ajax-script', plugin_dir_url( __FILE__ ).'my_javascript.js', array('jquery') );
wp_localize_script( 'ajax-script', 'my_ajax_object', array( 'ajax_url' => admin_url( 'admin-ajax.php' ) ) );
}
/****************************************************************************/
// Run Search Function
/****************************************************************************/
/* Register This Function When This File Is Loaded To Call By WordPress AJAX */
add_action('wp_ajax_nopriv_SearchFunction', 'ajaxSearchFunction'); // For Web Visitors
add_action('wp_ajax_SearchFunction', 'ajaxSearchFunction'); // For Admin User
function ajaxSearchFunction(){
if($_POST['WhatToSearch'] == ""){
$WhatToSearch = "Nothing";
} else {
$WhatToSearch = $_POST['WhatToSearch'];
}
echo "<div class='success'>SUCCESS: Function Is Working Perfectly And Getting Data ".$WhatToSearch.".</div>";
}
?>
my_javascript.js
jQuery(document).ready(function() {
jQuery('#searchForm').on("submit",function(e) {
var incomingData = jQuery('#searchForm').serializeArray();
incomingData.push({name: 'action', value: 'SearchFunction'});
alert(JSON.stringify(incomingData));
jQuery.ajax({
type: 'post',
url: my_ajax_object.ajax_url,
data: incomingData,
success: function(response) {
jQuery('#showReturnData').html(response);
},
error: function(response) {
jQuery('#showReturnData').html('<div">Error</div>');
},
});
return false; // For Not To Reload Page
});
});
感谢您阅读本文。如果您喜欢这个基本示例,请投票给问题和答案以帮助他人。
推荐阅读
- reactjs - 为什么`记录`不能在打字稿中应用传播类型?
- node.js - 在 NodeJS 上使用连接 Postgresql (express)
- android - 从 json api 获取数据但无法在 listview 中查看
- django - Django Rest 框架在没有序列化器的情况下将数据发送到视图
- c++ - 在 C++ 中设置基于 OS 的文件路径
- c - ioctl 返回 22 - 使用 FreeBSD 的 clang 编译器编译时参数无效
- php - PHP 联系我们表单在页面重新加载时发送
- http - 如果在 http.HandlerFunc 函数中发生恐慌,它不会被发送到客户端 http 状态码
- mysql - mysql触发器插入重复行
- webgl2 - 无法使用图像获得 WebGL2 纹理的工作示例