web-dev-qa-db-ja.com

カスタムプラグインで現在の投稿のIDにアクセスできない

私は一つの投稿のthe_contentの前にupvoteボックスを追加し、AJAXを介してメインプラグインPHPファイルにデータを送り返し、成功時にデータベース値を更新する関数を呼び出すプラグインを持っています。

これがAJAXからのPHPコールバックです。

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();
}

Chromeのデベロッパーツールでは、これは私に与えます:

bool(false)UPDATE wp_posts SET parlay_points = '26' WHERE id =クエリが失敗しました

お分かりのように、私はループの外側にあることによる失敗を説明するために$post変数をグローバルとして宣言しようとしました。 AJAXリクエストをトリガーするコンテンツはthe_contentの前に追加されるので、どういうわけか再度ループに「入る」必要があるかどうかわかりません。 if ( have_posts() )if ( is_single() )get_the_ID()の前に試してみましたが、成功しませんでした。ループは、一般的に、私を本当に混乱させます。

また、アクションフック$post->IDからthe_postにアクセスしてみました。不思議なことに、私は現在の投稿のIDをうまくエコーすることはできますが、それをグローバルスコープの変数に保存することはできません。

$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...
}

これもうまくいきません。

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

正しい$post_idがエコーされているので、私は上記の関数が呼ばれているのは確かです。しかし、投票ボタンをクリックすると次のようになります。

NULL UPDATE wp_posts SET parlay_points = '28' WHERE id =失敗したクエリ

2
AlexFADev

私の提案はあなたのAJAX呼び出しに投稿IDを渡すためにwp_localize_script()を使うことです。
このようなもの..

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

お分かりのように、ループの外側にあることによる失敗を考慮して、$ post変数をグローバルとして宣言してみました。

問題はではない投稿が「ループの外側」であるということです、問題はAJAX requestは完全に独立したHTTPリクエストです。

AJAXリクエストを実行するときは、ブラウザで新しいウィンドウを開き、この別のウィンドウでURLを開くのと同じです。つまり、AJAXリクエストを処理するスクリプトは、リクエストを送信したページについて何も認識していないということです

AJAXリクエストで特定の投稿を処理する必要がある場合は、AJAXリクエストデータの一部として処理する投稿IDを送信する必要があります。

1
gmazzap

Ajaxを介して単一の投稿の投稿IDも送信するのはどうですか。そのため、idを含む隠し入力を作成すると、次のようになります。

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

それから、あなたはただidを選んでそれをajaxリクエストを通して送ることができます、それであなたの関数はこのような何かを見ることになるでしょう:

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();
}   

私はまた、 $ wpdbオブジェクト を調べてみました。これは、$ mysqliを使用してDBクエーラーを処理することに興味を持っていました。

0
Lasse M. Tvedt