it-swarm.com.ru

Wordpress: как вызвать функцию плагина с помощью вызова ajax?

Я пишу плагин 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

12
Bee

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 без тега 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);
          }
        });
    });
});
22
John P Bloch

Среда WordPress

Прежде всего, для решения этой задачи рекомендуется зарегистрироваться, а затем поставить в очередь сценарий jQuery, который будет отправлять запрос на сервер. Эти операции будут подключены в ловушке действия wp_enqueue_scripts. В тот же хук вы должны поместить wp_localize_script, который используется для включения произвольного Javascript. Таким образом, во внешнем интерфейсе будет доступен объект JS. Этот объект имеет правильный URL-адрес, который будет использоваться дескриптором jQuery.

Пожалуйста, посмотрите на:

  1. wp_register_script (); функция
  2. wp_enqueue_scripts хук
  3. wp_enqueue_script (); функция
  4. wp_localize_script (); функция

Файл: 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. Запомните суффиксы:

  1. wp_ajax (разрешить функцию только для зарегистрированных пользователей или операций панели администратора)
  2. wp_ajax_nopriv (разрешить функцию для пользователей без привилегий)

Эти суффиксы плюс действие составляют название вашего действия:

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
}

Надеюсь, поможет!

Дайте мне знать, если что-то не понятно.

4
rams0610

Просто чтобы добавить информацию. Если вы хотите получить объект из функции метода класса php:

файл 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();
}
0
J.BizMai