私は一つの投稿の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 =失敗したクエリ
私の提案はあなたの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')
お分かりのように、ループの外側にあることによる失敗を考慮して、$ post変数をグローバルとして宣言してみました。
問題はではない投稿が「ループの外側」であるということです、問題はAJAX requestは完全に独立したHTTPリクエストです。
AJAXリクエストを実行するときは、ブラウザで新しいウィンドウを開き、この別のウィンドウでURLを開くのと同じです。つまり、AJAXリクエストを処理するスクリプトは、リクエストを送信したページについて何も認識していないということです。
AJAXリクエストで特定の投稿を処理する必要がある場合は、AJAXリクエストデータの一部として処理する投稿IDを送信する必要があります。
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クエーラーを処理することに興味を持っていました。