Я пишу плагин WordPress MU, он содержит ссылку с каждым сообщением, и я хочу использовать ajax для вызова одной из функций плагина, когда пользователь нажимает на эту ссылку, а затем динамически обновляет текст ссылки с выходом из этой функции ,
Я застрял с ajax-запросом. У меня есть этот сложный, явно хакерский, способ сделать это, но он не совсем работает. Что такое «правильный» или «Wordpress» способ включения функции ajax в плагин?
(Мой текущий код взлома ниже. Когда я нажимаю на ссылку генерации, я не получаю тот же вывод, который я получаю на странице wp, так же, как когда я перехожу непосредственно к sample-ajax.php в свой браузер.)
У меня мой код [1] настроен следующим образом:
мю-плагинов / 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')); }
му-плагинов / образец / образец-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); } }); }); });
му-плагинов / образец / образец-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. Отправьте свой запрос ajax в /wp-admin/admin-ajax.php, используя POST с аргументом «action»:
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'));
или подключить его так, чтобы работать только для не зарегистрированных пользователей:
add_action('wp_ajax_nopriv_my_unique_action',array($sample_plugin,'doAjax'));
Используйте оба варианта, если вы хотите, чтобы он работал для всех.
admin-ajax.php уже использует некоторые имена действий, поэтому убедитесь, что вы просматриваете файл и не используете одни и те же имена действий, иначе вы случайно попытаетесь сделать что-то вроде удаления комментариев и т. д.
РЕДАКТИРОВАТЬ
Извините, я не совсем понял вопрос. Я думал, вы спрашиваете, как выполнить запрос ajax. Во всяком случае, две вещи, которые я бы постарался:
Во-первых, ваша функция будет эхом только слова AJAX без тега. Затем попробуйте изменить свой вызов 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); } }); }); });
Среда WordPress
Прежде всего, чтобы достичь этой задачи, рекомендуется зарегистрировать затем вставить сценарий jQuery, который будет вызывать запрос на сервер. Эти операции будут подключены в wp_enqueue_scripts
action hook. В том же самом крюке вы должны поместить wp_localize_script
чтобы он включал произвольный Javascript. Таким образом, в передней части будет доступен объект JS. Этот объект содержит правильный URL-адрес, который будет использоваться дескриптором jQuery.
Пожалуйста, взгляните на:
Файл: functions.php 1/2
add_action( 'wp_enqueue_scripts', 'so_enqueue_scripts' ); function so_enqueue_scripts(){ wp_register_script( 'ajaxHandle', get_template_directory() . 'PATH TO YOUR JS FILE', array(), false, true ); wp_enqueue_script( 'ajaxHandle' ); wp_localize_script( 'ajaxHandle', 'ajax_object', array( 'ajaxurl' => admin_url( 'admin-ajax.php' ) ) ); }
Файл: jquery.ajax.js
Этот файл делает вызов ajax.
jQuery(document).ready( function($){ //Some event will trigger the ajax call, you can push whatever data to the server, simply passing it to the "data" object in ajax call $.ajax({ url: ajax_object.ajaxurl, // this is the object instantiated in wp_localize_script function type: 'POST', data:{ action: 'myaction', // this is the function in your functions.php that will be triggered name: 'John', age: '38' }, success: function( data ){ //Do something with the result from server console.log( data ); } }); });
Файл: functions.php 2/2
Наконец, в вашем файле functions.php должна быть функция, вызванная вашим вызовом ajax. Помните суффиксы:
Эти суффиксы плюс действие составляют название вашего действия:
wp_ajax_myaction
или wp_ajax_nopriv_myaction
add_action( 'wp_ajax_myaction', 'so_wp_ajax_function' ); add_action( 'wp_ajax_nopriv_myaction', 'so_wp_ajax_function' ); function so_wp_ajax_function(){ //DO whatever you want with data posted //To send back a response you have to echo the result! echo $_POST['name']; echo $_POST['age']; wp_die(); // ajax call must die to avoid trailing 0 in your response }
Надеюсь, поможет!
Дайте мне знать, если что-то неясно.
Просто добавьте информацию. Если вы хотите получить объект из функции метода php class:
js-файл
jQuery(document).ready(function(){ jQuery(".foobar").bind("click", function() { var data = { 'action': 'getAllOptionsByAjax', 'arg1': 'val1', 'arg2': $(this).val() }; jQuery.post( ajaxurl, data, function(response) { var jsonObj = JSON.parse( response ); }); });
файл php
public static function getAllOptionsByAjax(){ global $wpdb; // Start query string $query_string = "SELECT * FROM wp_your_table WHERE col1='" . $_POST['arg1'] . "' AND col2 = '" . $_POST['arg2'] . "' "; // Return results $a_options = $wpdb->get_results( $query_string, ARRAY_A ); $f_options = array(); $f_options[null] = __( 'Please select an item', 'my_domain' ); foreach ($a_options as $option){ $f_options [$option['id']] = $option['name']; } $json = json_encode( $f_options ); echo $json; wp_die(); }