私は、外部APIからデータを引き出してそれをbbPressトピックに挿入するプラグインを書いています。ここにいくつかのサンプルコードがあります:
function bbp_ajax() {
$topic_id = bbp_get_topic_id();
$the_issue_key = get_post_meta( $topic_id, 'bbp_jira_issue_field', true);
$nonce = wp_create_nonce( 'theNonce' );
// jQuery AJAX Code, actions bbpAjax...
}
add_action ( 'bbp_template_before_replies_loop', 'bbp_ajax');
function get_ajax_content() {
check_ajax_referer( "theNonce" );
$api_url = get_option( 'jifbs_url' );
$fullurl = $api_url.$the_issue_key;
$username = get_option( 'jifbs_username' );
// Then I pull in the data with cURL and echo it. But I need $the_issue_key to complete the API auth
}
add_action( 'wp_ajax_bbpAjax', 'get_ajax_content' );
add_action( 'wp_ajax_nopriv_bbpAjax', 'get_ajax_content' );
$the_issue_key
をget_ajax_content
関数に渡す方法がわかりません。グローバル(シャダー)として設定しようとしましたが、常にnullが返されます。
get_ajax_content関数で実行される$the_issue_key = get_post_meta( $topic_id, 'bbp_jira_issue_field', true);
はnullを返します。
私が知っておく必要があるかもしれないwp_ajax
アクションに特有の何かがありますか - または私は本当に明白な何かを逃していますか?
JavaScriptがajaxを使用してPHPに返すことができるように、変数の値をページに配置する必要があります。 Ajax関数は完全に独立した「ページロード」であるため、グローバルにしても機能しません。これを行う最良の方法は "wp_localize_script"を使用することです( https://codex.wordpress.org/Function_Reference/wp_localize_script )
これが可能な方法の完全な例です。
//First enqueue your javascript in WordPress
function your_prefix_enqueue_scripts(){
//Enqueue your Javascript (this assumes your javascript file is located in your plugin in an "includes/js" directory)
wp_enqueue_script( 'your_unique_js_name', plugins_url('js/yourjavascriptfile.js', dirname(__FILE__) ), array( 'jquery' ) );
//OR (simpler but not recommended)
wp_enqueue_script( 'your_unique_js_name', 'http://domain.com/myjavascriptfile.js', array( 'jquery' ) );
//Here we create a javascript object variable called "youruniquejs_vars". We can access any variable in the array using youruniquejs_vars.name_of_sub_variable
wp_localize_script( 'your_unique_js_name', 'youruniquejs_vars',
array(
//To use this variable in javascript use "youruniquejs_vars.ajaxurl"
'ajaxurl' => admin_url( 'admin-ajax.php' ),
//To use this variable in javascript use "youruniquejs_vars.the_issue_key"
'the_issue_key' => $the_issue_key,
)
);
}
add_action( 'wp_enqueue_scripts', 'your_prefix_enqueue_scripts' );
//This is your Ajax callback function
function your_ajax_callback_function_name(){
//Get the post data
$the_issue_key = $_POST["the_issue_key"];
//Do your stuff here
//Create the array we send back to javascript here
$array_we_send_back = array( 'test' => "Test" );
//Make sure to json encode the output because that's what it is expecting
echo json_encode( $array_we_send_back );
//Make sure you die when finished doing ajax output.
die();
}
add_action( 'wp_ajax_' . 'your_ajax_callback_function_name', 'your_ajax_callback_function_name' );
add_action( 'wp_ajax_nopriv_' . 'your_ajax_callback_function_name', 'your_ajax_callback_function_name' );
そして、あなたのjavascriptファイルで次のようなことをしてください。
jQuery(document).ready(function($){
/**
* When your ajax trigger is clicked
*
*/
$( document ).on( 'click', '.my-button', function(event){
event.preventDefault();
// Use ajax to do something...
var postData = {
action: 'your_ajax_callback_function_name',
the_issue_key: youruniquejs_vars.the_issue_ke,
}
//Ajax load more posts
$.ajax({
type: "POST",
data: postData,
dataType:"json",
url: youruniquejs_vars.ajaxurl,
//This fires when the ajax 'comes back' and it is valid json
success: function (response) {
alert( response.test );
}
//This fires when the ajax 'comes back' and it isn't valid json
}).fail(function (data) {
console.log(data);
});
});
});