web-dev-qa-db-ja.com

関数からadd_shortcode関数に返された変数を取得します

私はこれに続いてajaxオブジェクトをバックエンドに渡すことに成功しています(JSのスクリプトは実際には問題ありません)。

add_action( 'wp_ajax_my_action', 'my_action_callback' );
add_action( 'wp_ajax_nopriv_my_action', 'my_action_callback' );
add_action( 'wp_enqueue_scripts', 'theme_name_scripts' );
add_shortcode('tagtest', 'timezone');

function theme_name_scripts() {
    wp_enqueue_script( 'script-name', plugins_url( '/assets/js/timezone.js', __FILE__ ), array('jquery'), '1.0.0', true );
    wp_localize_script( 'script-name', 'MyAjax', array(
        'ajaxurl' => admin_url( 'admin-ajax.php' ),
        'security' => wp_create_nonce( 'my-special-string' ),
    ));
}

function my_action_callback() {
    $whatever = strval( $_POST['whatever'] );
    echo $whatever;
    return $whatever;
    wp_die();
}

しかし、add_shortcodeフックの関数であるタイムゾーン関数があります。タイムゾーン関数でmy_action_callbackから$ whatever変数を取得する必要があります。どうやってやるの?

function timezone(){
    $whatever = //Here I need the result from my_action_callback function
}

念のために、ここに私のJSスクリプトとオブジェクトが正常に渡されていることを確認するための画像を示します。

jQuery(document).ready(function($) {

  var data = {
    action: 'my_action',
    security : MyAjax.security,
    whatever: 'Hello there'
  };

  // since 2.8 ajaxurl is always defined in the admin header and points to admin-ajax.php
  $.post(MyAjax.ajaxurl, data, function(response) {
    alert('Here is: ' + response);
    return response;
  });
});

これがXHRの応答です。

action: my_action
security: f1860eab4b
whatever: Hello there

Add_actionコールバックで問題なくこのオブジェクトを取得しています。

enter image description here

前にも述べたように、私が必要としていること、それがうまくいっていないことは、$ whateverをタイムゾーン関数で取得することだけです(タイムゾーンはadd_shortcodeの関数です)前もって感謝します。

1
dfrojas

ショートコードのコールバックにAJAXを入れることはできません。意味がありません。あなたがAJAXリクエストをしているなら、フロントエンドでそれをしていて、そしてショートコードはすでにレンダリングされています。

そのため、AJAX要求への応答に対して行うことはすべてフロントエンドで行う必要があります。だからあなたがする必要があるのはあなたのJavaScriptがフロントエンドにデータを入れるのに使うことができるクラスまたはIDと共にショートコードで何らかのHTMLを出力することです。

だからあなたのショートコードはこのようになるでしょう:

function timezone(){
    echo '<div class="timezone"></div>';
}

それであなたのAJAXリクエストはそのdivに完了時のレスポンスを入れるべきです:

$.post(MyAjax.ajaxurl, data, function(response) {
    $('.timezone').html( response );
});

その例では、jQueryを使ってそのdivのHTMLをレスポンスの値に設定しています。

ショートコードにデフォルト値を設定したい場合は、出力を担当する関数を独自の関数に抽象化するという方法があります。それから、AJAXコールバックとショートコードコールバックの両方の中で同じ関数を使うだけです。

それでは、テキストを出力するための関数を作成しましょう。

function wpse_301294_whatever() {
    return 'Whatever';
}

その関数は文字列Whateverを返します。

その後、div内でこの関数を使用するようにショートコードを更新することができます。

function timezone(){
    echo '<div class="timezone">' . wpse_301294_whatever() . '</div>';
}

そしてAJAXコールバック:

function my_action_callback() {
    echo wpse_301294_whatever();
    wp_die();
}

これで、出力を担当する関数wpse_301294_whatever()、およびその出力をさまざまなコンテキストで使用できるShortcodeとAJAXコールバックができました。

1
Jacob Peattie