web-dev-qa-db-fra.com

Comment puis-je accrocher une demande Ajax dans un PHP rappeler?

En suivant les instructions ici http://codex.wordpress.org/AJAX_in_Plugins#Ajax_on_the_Administration_Side

J'ai écrit ce code:

Édité pour inclure DIE (), ne fonctionne toujours pas

function my_button() {
echo
"<script type = 'text/javascript'>
function ajaxRequest(){
    jQuery(document).ready(function(jQuery) {
        var sendData = {};
        sendData['action'] = 'my_action';
        sendData['external_id'] = '$postID';
        sendData['title'] = '$post_title';
        sendData['content'] = '$post_content';
        jQuery.ajax({
            type: 'POST',
            url: 'http://lvh.me:3000/s/wp',
            xhrFields: {
                withCredentials: true
            },
            headers: {'X-Requested-With': 'XMLHttpRequest'},
            data: sendData,
            error: function(jqXHR){
                console.log(jqXHR.responseText);
            },
            success: function(data){
                window.open(data['link']);
            }
        });
    })
};
</script>
<input type='button' onclick='ajaxRequest()' value='Send' />";
}

add_action( 'dbx_post_sidebar', my_button);

add_action('wp_ajax_my_action', my_action_callback);

function my_action_callback() {
  global $wpdb; // this is how you get access to the database
  $api_key = $_POST['api_key'];
  $user = wp_get_current_user();
  $user_id = $user->ID;
  add_user_meta($user_id, 'my_api_key', $api_key);
  die();
}

Je sais que c'est une tonne de code, mais je ne peux tout simplement pas savoir où se trouve l'erreur.

Merci beaucoup.

4
Kate Ray

Votre URL devrait pointer vers admin-ajax.php

echo admin_url('admin-ajax.php');
4
Milo

EDIT: J'ai trouvé plusieurs problèmes avec votre méthode.

Voici comment cela devrait être fait pour votre cas, je suis allé de l'avant et j'ai réécrit certaines choses.

function my_button() {
echo
"<script type = 'text/javascript'>
    jQuery( document ).ready( function() {

        jQuery('input.sendajax').click( function() {

            var sendData = {
                action: 'my_action',
                external_id = $postID,
                title: '$post_title',
                content: '$post_content'
            };

            jQuery.post( ajaxurl, sendData, function( response ) {

                // You need to send some type of validation back
                // Like a 'success' variable either true or false
                // Stuff sent back is accessed through the 'response' variable, so to get the item sent back called 'success', you would use 'response.success'

                if( response.success == true ) {
                    window.open(response.link);
                } else {
                    console.log(response);
                }

            });

        });

    })
</script>
<input class='sendajax' type='button' onclick='ajaxRequest()' value='Send' />";
}

add_action( 'admin_head', 'my_button');

add_action('wp_ajax_my_action', 'my_action_callback');

function my_action_callback() {
  global $wpdb; // this is how you get access to the database
  $api_key = $_POST['api_key'];
  $user = wp_get_current_user();
  $user_id = $user->ID;
  add_user_meta($user_id, 'my_api_key', $api_key);

  $response = array( 'success' => true, 'link' => 'this is a response var' ); // Stuff to send back to AJAX
  echo json_encode( $response );

  die(); // Needs this
}

Si vous lisez attentivement le Codex et comparez votre code au code ici , ils sont très différents. Vous essayiez d'utiliser une méthode que la plupart jugeraient appropriée mais WP peut déjà faire ces choses pour vous (ce que je n'avais même pas réalisé il y a quelques jours, alors ne vous sentez pas mal!)

Ce que j'ai fait est d'utiliser la méthode native ajaxurl et jQuery.post de WP pour appeler admin-ajax.php et envoyer les informations sendData à une fonction qui utilisera ces variables, puis renvoie une response afin que vous puissiez également utiliser cette fonction.

1
Jared

Il semble que vous deviez diviser ce que vous faites en deux parties.

1/Interrogez votre API externe, puis renvoyez votre clé API

2/Associer la clé API à un utilisateur.

Je voudrais donc d'abord interroger votre API via un appel ajax standard, puis dans le gestionnaire de succès de ce premier appel ajax, exécutez votre appel interne wp admin-ajax pour associer l'utilisateur à la clé de l'API.

1
Dale Sattler