我正在编写一个Wordpress MU插件,它包含每个帖子的链接,我想在用户单击此链接时使用ajax调用其中一个插件函数,然后使用输出动态更新链接文本来自该函数。
我被 ajax 查询困住了。我有这种复杂的、显然是黑客式的方法来做到这一点,但它不太有效。在插件中包含 ajax 功能的“正确”或“wordpress”方式是什么?
(我当前的黑客代码如下。当我单击生成链接时,我在 wp 页面中得到的输出与在浏览器中直接访问 example-ajax.php 时得到的输出不同。)
我的代码[1]设置如下:
mu-plugins/sample.php:
<?php
/*
Plugin Name: Sample Plugin
*/
if (!class_exists("SamplePlugin")) {
class SamplePlugin {
function SamplePlugin() {}
function addHeaderCode() {
echo '<link type="text/css" rel="stylesheet" href="'.get_bloginfo('wpurl').
'/wp-content/mu-plugins/sample/sample.css" />\n';
wp_enqueue_script('sample-ajax', get_bloginfo('wpurl') .
'/wp-content/mu-plugins/sample/sample-ajax.js.php',
array('jquery'), '1.0');
}
// adds the link to post content.
function addLink($content = '') {
$content .= "<span class='foobar clicked'><a href='#'>click</a></span>";
return $content;
}
function doAjax() { //
echo "<a href='#'>AJAX!</a>";
}
}
}
if (class_exists("SamplePlugin")) {
$sample_plugin = new SamplePlugin();
}
if (isset($sample_plugin)) {
add_action('wp_head',array(&$sample_plugin,'addHeaderCode'),1);
add_filter('the_content', array(&$sample_plugin, 'addLink'));
}
mu-plugins/sample/sample-ajax.js.php:
<?php
if (!function_exists('add_action')) {
require_once("../../../wp-config.php");
}
?>
jQuery(document).ready(function(){
jQuery(".foobar").bind("click", function() {
var aref = this;
jQuery(this).toggleClass('clicked');
jQuery.ajax({
url: "http://mysite/wp-content/mu-plugins/sample/sample-ajax.php",
success: function(value) {
jQuery(aref).html(value);
}
});
});
});
mu-plugins/sample/sample-ajax.php:
<?php
if (!function_exists('add_action')) {
require_once("../../../wp-config.php");
}
if (isset($sample_plugin)) {
$sample_plugin->doAjax();
} else {
echo "unset";
}
?>
[1] 注意: 下面的教程让我到目前为止,但我在这一点上遇到了困难。 http://www.devlounge.net/articles/using-ajax-with-your-wordpress-plugin
最佳答案
TheDeadMedic 不太正确。 WordPress 内置了 AJAX 功能。使用带有参数“action”的 POST 将您的 ajax 请求发送到/wp-admin/admin-ajax.php:
jQuery(document).ready(function(){
jQuery(".foobar").bind("click", function() {
jQuery(this).toggleClass('clicked');
jQuery.ajax({
type:'POST',
data:{action:'my_unique_action'},
url: "http://mysite/wp-admin/admin-ajax.php",
success: function(value) {
jQuery(this).html(value);
}
});
});
});
如果您只想让它对登录用户起作用,则将其挂接到插件中,如下所示:
add_action('wp_ajax_my_unique_action',array($sample_plugin,'doAjax'));
或者像这样 Hook 它仅适用于未登录的用户:
add_action('wp_ajax_nopriv_my_unique_action',array($sample_plugin,'doAjax'));
如果您希望它适用于每个人,请同时使用两者。
admin-ajax.php 已经使用了一些操作名称,因此请确保您仔细查看该文件并且不要使用相同的操作名称,否则您会意外地尝试执行删除评论等操作。
编辑
抱歉,我不太明白这个问题。我以为你问的是如何进行 ajax 请求。不管怎样,我会尝试两件事:
首先,让您的函数仅回显 AJAX 一词,而不带 a
标记。接下来,尝试更改您的 ajax 调用,以便它同时具有成功和完整的回调:
jQuery(document).ready(function(){
jQuery(".foobar").bind("click", function() {
var val = '';
jQuery(this).toggleClass('clicked');
jQuery.ajax({
type:'POST',
data:{action:'my_unique_action'},
url: "http://mysite/wp-admin/admin-ajax.php",
success: function(value) {
val = value;
},
complete: function(){
jQuery(this).html(val);
}
});
});
});
关于php - WordPress:如何通过ajax调用来调用插件函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2908823/