web-dev-qa-db-fra.com

Comment intégrer Ajax dans un thème - sans écrire de plugin?

Ok, je commence avec quelques AJAX trucs dans un thème wordpress

1) Je construis un thème enfant en dehors du cadre thématique 2) Mon thème enfant a un header.php, un index.php, un functions.php et un style.css (à ce stade)

Dans mon header.php, j'ai les éléments suivants (au fait, le code est adapté de http://codex.wordpress.org/AJAX_in_Plugins ):

<?php
    if( !is_admin() ) {
 add_action('wp_ajax_my_special_action', 'my_action_callback');
 add_action('wp_ajax_nopriv_my_special_action', 'my_action_callback');
 $_ajax = admin_url('admin-ajax.php');    
}
?>
<script type="text/javascript" >
jQuery(document).ready(function($) {

 var data = {
  action: 'my_special_action',
  whatever: 1234
 };

 jQuery.post('<?php echo($_ajax); ?>', data, function(response) {
  jQuery('#output').html('Got this from the server: ' + response);
 });

});
</script>
</head>

Bien, donc tout est cool - et il met à jour le div de la sortie OUTPUT sur la page avec "Got this from the server: 0"

J'ai besoin d'une fonction PHP appelée "my_action_callback" - donc, dans le functions.php de mon thème, j'ai les éléments suivants:

function my_action_callback() {

 $whatever = $_POST['whatever'];

 $whatever += 10;

    echo 'whatever now equals: ' . $whatever;

 die();
}

C’est la seule fonction dans mon functions.php

Pour être sûr que la fonction PHP fonctionne, je colle my_action_callback () dans mon index.php - et il affiche "tout ce qui est égal à: 10" comme prévu.

CEPENDANT - la réponse AJAX est toujours 'Compris par le serveur: 0' Ajax ne semble jamais recevoir la réponse de la fonction PHP.

J'ai essayé d'ajouter .ajaxError () pour voir s'il y avait des erreurs - Nope.

J'ai essayé d'ajouter les fonctions PHP à un autre plugin de mine - nope.

Qu'est-ce qui me manque si jQuery ne fait pas le bit ajax pour moi?

Merci d'avance

3
keranm

Placez également ces fonctions add_action dans votre fichier functions.php. S'ils sont dans header.php, WordPress ne les enregistre jamais, car l'en-tête n'est pas chargé dans AJAX. De plus, vous n'avez pas besoin de cette vérification is_admin(). L'en-tête du thème ne se chargera jamais dans admin. Donc, votre fichier de fonctions devrait ressembler à ceci:

add_action('wp_ajax_my_special_action', 'my_action_callback');
add_action('wp_ajax_nopriv_my_special_action', 'my_action_callback');
function my_action_callback() {

 $whatever = $_POST['whatever'];

 $whatever += 10;

    echo 'whatever now equals: ' . $whatever;

 die();
}

Et le début de cette partie du fichier d'en-tête de votre thème devrait ressembler à ceci:

<?php
$_ajax = admin_url('admin-ajax.php');
?>
<script type="text/javascript" >
jQuery(document).ready(function($) {

En dehors de cela, votre code a l'air d'aller pour le mieux!

6
John P Bloch