Warum funktioniert der ‘do_shortcode’ eines Plugins in einer AJAX-Anfrage nicht?

tl; dr: Der Shortcode von Kontaktformular 7 funktioniert in einer AJAX-Anfrage nicht, wenn er mit do_shortcode

functionen.php

 add_action('wp_ajax_ps_get_survey_form', 'ps_get_survey_form'); add_action('wp_ajax_nopriv_ps_get_survey_form', 'ps_get_survey_form'); function ps_get_survey_form() { echo do_shortcode( '[contact-form-7 id="397" title="Contact form 1"]' ); die(); } 

script.js

 jQuery(document).ready(function($){ $('#survey-modal').fancybox({ href: ajaxurl, ajax: { type : "POST", data : {action: 'ps_get_survey_form'} } }); }); 

Jedoch,

 echo do_shortcode( '[contact-form-7 id="397" title="Contact form 1"]' ) 

gibt die Shortcode-Zeichenfolge selbst zurück. Es funktioniert gut, wenn ich es in eine Vorlage lege.

Versuchen Sie, wie ich könnte (lächerliche Dinge wie das Einschließen in einen Post / das Anwenden des content-Filters, das manuelle Abfeuern verschiedener Aktionen, in die CF7 einhakt usw.), es lehnt es ab, sich in ein Formular zu übersetzen.

Wie debugge ich das?

BEARBEITEN

@Kaiser schlägt vernünftigerweise vor, dass ich keinen Zugriff auf do_shortcode habe. Ich habe versucht, dies zu überprüfen, mit folgendem Ergebnis:

 function ps_get_survey_form() { //include( ABSPATH . 'wp-includes/shortcodes.php' ); //Causes fatal error: cannot redeclare add_shortcode if ( function_exists( 'do_shortcode ' ) ) { echo "do_shortcode exists"; } else { echo "do_shortcode doesn't exist"; // this gets echoed } do_shortcode( 'foo' ); // this fails silently, even though the function apparently hasn't been defined //foo(); // Causes fatal error as expected //echo do_shortcode( '[contact-form-7 id="397" title="contact form 1"]' ); die(); } 

Solutions Collecting From Web of "Warum funktioniert der ‘do_shortcode’ eines Plugins in einer AJAX-Anfrage nicht?"

WP Ajax führt sowohl öffentliche als auch geschlossene Aufrufe über admin.php . Dies bedeutet, dass Sie nicht auf die gesamte wp-Umgebung zugreifen können, wie zum Beispiel do_shortcode() , das sich in /wp-includes/shortcodes.php .

Dies kann immer noch bearbeitet werden (und auch für oEmbed). Im folgenden Beispiel können Sie in Ihrem AJAX-callback sowohl oEmbed- Handler als auch Shortcode-Handler für eine \WP_Post::post_content Eigenschaft \WP_Post::post_content .

 /** \WP_Post $post */ $post = get_post(); /** @var \WP_Embed $wp_embed */ global $wp_embed; $wp_embed->post_ID = $post->ID; // [embed] shortcode $wp_embed->run_shortcode( $post->post_content ); // plain links on their own line $wp_embed->autoembed( $post->post_content ); // Enable shortcodes do_shortcode( $post->post_content ); 

PROTip: Niemals echo do_shortcode( '[some-short-code arg="foo"]' ); rufen echo do_shortcode( '[some-short-code arg="foo"]' ); direkt. Ein Shortcode ist nur ein Platzhalter für den Editor . Jedem Kurzwahlcode muss ein callback zugeordnet sein. Verwenden Sie stattdessen den callback. So sparen Sie teure Regex-Prüfungen.

Die Antwort besteht darin, adjax-ajax-Beschränkungen zu umgehen, indem Sie sie selbst handhaben, wie @OneTrickPony es empfiehlt.

 add_action( 'init', function() { ps_register_shortcode_ajax( 'ps_get_survey_form', 'ps_get_survey_form' ); } ); function ps_register_shortcode_ajax( $callable, $action ) { if ( empty( $_POST['action'] ) || $_POST['action'] != $action ) return; call_user_func( $callable ); } function ps_get_survey_form() { echo do_shortcode( '[contact-form-7 id="397" title="contact form 1"]' ); die(); }