web-dev-qa-db-fra.com

Impossible d'accéder à l'ID de la publication en cours dans un plugin personnalisé

J'ai un plugin qui ajoute un ___ au the_content d'un message, ajoute des données via AJAX au fichier de plugin principal PHP et appelle une fonction pour mettre à jour la valeur d'une base de données .

Voici le rappel PHP de AJAX:

function update_parlay_points() {
    //Update Parlay Points field on database with points from Post request. 
    //global $post;
    //$post_id = $post->ID;     
    $post_id = get_the_ID();
    $points = $_POST['score'];      
    $update_points = "UPDATE wp_posts 
        SET parlay_points = '$points' 
        WHERE id = $post_id";   
    var_dump( $post_id );
    echo $update_points;           
    global $mysqli;
    $mysqli->query( $update_points ) or die( "Query failed" );
    wp_die();
}

Dans les outils de développement de Chrome, cela me donne:

bool (false) UPDATE wp_posts SET parlay_points = '26' WHERE id = La requête a échoué

Comme vous pouvez le constater, j'ai essayé de déclarer la variable $post comme globale afin de prendre en compte les échecs dus au fait d'être en dehors de la boucle. Le contenu qui déclenche la demande AJAX a été ajouté au préfixe the_content. Je ne suis donc pas sûr de devoir "entrer" de nouveau dans la boucle. J'ai essayé if ( have_posts() ) et if ( is_single() ) avant get_the_ID() sans succès. La boucle, en général, me confond vraiment.

J'ai également essayé d'accéder à $post->ID à partir du hook d'action the_post. Chose étrange, je suis en mesure de faire écho à l'identifiant de la publication en cours, mais je ne peux pas la stocker dans une variable à portée globale.

$post_id = Null;
add_action( 'the_post', 'wp_store_post_info' );
function wp_store_post_info() {
    //Set current post as global variable. 
    global $post;
    global $post_id;
    $post_id = $post->ID;
    echo $post_id;
}
function update_parlay_points() {
    //...
    global $post_id;
    //Do stuff with the $post_id...
}

Cela ne marche pas non plus:

$GLOBALS['post_id'] = $post->ID;

Je suis certain que la fonction ci-dessus est appelée, car le $post_id correct est répercuté. Cependant, lorsque je clique sur le bouton de vote positif, je reçois:

NULL UPDATE wp_posts SET parlay_points = '28' WHERE id = Echec de la requête

2
AlexFADev

Ma suggestion est d'utiliser wp_localize_script() pour transmettre l'identifiant de publication à vos appels AJAX.
Quelque chose comme ça..

function my_script_enqueue() {
    global $post;

    $translations = array(
        'postID' => $post->ID
    );

    wp_enqueue_script( 'myscript', '/url/to/your/script.js', array('jquery') );
    wp_localize_script( 'myscript', 'MyAJAX', $translations );
}
add_action('wp_enqueue_scripts', 'my_script_enqueue')
1
Abhik

Comme vous pouvez le constater, j’ai essayé de déclarer la variable $ post comme globale pour tenir compte des échecs dus à l’extérieur de la boucle.

Le problème est pas que la publication est "en dehors de la boucle" , le problème est que AJAX La requête est une requête HTTP complètement distincte.

Lorsque vous faites une demande AJAX, vous ouvrez une nouvelle fenêtre dans le navigateur et ouvrez l'URL dans cette fenêtre séparée. Cela signifie que le script qui gère la demande AJAX ne connaît rien sur la page qui a envoyé la demande.

Si vous devez traiter une publication spécifique dans la demande AJAX, vous devez envoyer l'ID de publication à traiter dans le cadre des données de la demande AJAX.

1
gmazzap

Qu'en est-il de l'envoi de l'identifiant du post single via ajax également? Donc, si vous créez une entrée cachée contenant l'id, quelque chose comme ceci:

<input type="hidden" id="post_id" name="post_id" value="<?php echo $post->ID; ?>">

Ensuite, vous pouvez simplement choisir l’identifiant et l’envoyer par la requête ajax. Votre fonction ressemblera à ceci:

function update_parlay_points() {

    //Update Parlay Points field on database with points from Post request.     
    $post_id = $_POST['post_id'];
    $points = $_POST['score'];      

    $update_points = "UPDATE wp_posts 
        SET parlay_points = '$points' 
        WHERE id = $post_id";   

    var_dump( $post_id );

    echo $update_points;           

    global $mysqli;
    $mysqli->query( $update_points ) or die( "Query failed" );

    wp_die();
}   

Je voudrais également vérifier l'objet $ wpdb , au lieu d'utiliser $ mysqli pour gérer les bases de données.

0
Lasse M. Tvedt