为什么插件的‘do_Shortcode’在AJAX请求中不起作用?

时间:2012-05-25 作者:djb

tl;dr: 使用调用Contact Form 7时,其快捷码在AJAX请求中不起作用do_shortcode

功能。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();
}
脚本。js公司

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

    $(\'#survey-modal\').fancybox({
        href: ajaxurl,
        ajax: {
            type : "POST",
            data : {action: \'ps_get_survey_form\'}
        }
    });
});
然而,

echo do_shortcode( \'[contact-form-7 id="397" title="Contact form 1"]\' )
返回短码字符串本身。如果我把它放在模板中,效果很好。

尽我所能地尝试(可笑的事情,如将其包装在帖子中/应用\\u内容过滤器、手动触发CF7挂钩的各种操作等),它拒绝将自己转换为表单。

我如何调试它?

EDIT

@Kaiser明智地建议我没有访问do\\u快捷码的权限。我尝试对此进行检查,结果如下:

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

2 个回复
最合适的回答,由SO网友:djb 整理而成

答案是像@OneTrickPony建议的那样,通过自己处理来避免管理ajax限制。

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

SO网友:kaiser

WP Ajax通过运行公共调用和关闭调用admin.php. 这意味着您无法访问整个wp环境,例如do_shortcode(), 在里面/wp-includes/shortcodes.php.

这仍然可以解决(对于oEmbed也是如此)。请参见以下示例,您可以在AJAX回调中使用该示例为\\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: 从不打电话echo do_shortcode( \'[some-short-code arg="foo"]\' ); 直接地快捷码只是编辑器的占位符。Every 短代码必须附加回调。改用回调。这样可以避免运行昂贵的正则表达式检查。

结束

相关推荐

AJAX函数不返回任何结果

当我单击一个链接时,我试图创建一个ajax调用,该链接是帖子缩略图,结果应该显示帖子内容。当我使用管理ajax时。php它工作得很好,但问题是URL无法访问。这是我的ajaxcall $.ajax({ //url: admin_url + \'/wp-admin/admin-ajax.php\', url: href + \'?action=ajax\', dataType: \'json\', dat

为什么插件的‘do_Shortcode’在AJAX请求中不起作用? - 小码农CODE - 行之有效找到问题解决它

为什么插件的‘do_Shortcode’在AJAX请求中不起作用?

时间:2012-05-25 作者:djb

tl;dr: 使用调用Contact Form 7时,其快捷码在AJAX请求中不起作用do_shortcode

功能。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();
}
脚本。js公司

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

    $(\'#survey-modal\').fancybox({
        href: ajaxurl,
        ajax: {
            type : "POST",
            data : {action: \'ps_get_survey_form\'}
        }
    });
});
然而,

echo do_shortcode( \'[contact-form-7 id="397" title="Contact form 1"]\' )
返回短码字符串本身。如果我把它放在模板中,效果很好。

尽我所能地尝试(可笑的事情,如将其包装在帖子中/应用\\u内容过滤器、手动触发CF7挂钩的各种操作等),它拒绝将自己转换为表单。

我如何调试它?

EDIT

@Kaiser明智地建议我没有访问do\\u快捷码的权限。我尝试对此进行检查,结果如下:

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

2 个回复
最合适的回答,由SO网友:djb 整理而成

答案是像@OneTrickPony建议的那样,通过自己处理来避免管理ajax限制。

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

SO网友:kaiser

WP Ajax通过运行公共调用和关闭调用admin.php. 这意味着您无法访问整个wp环境,例如do_shortcode(), 在里面/wp-includes/shortcodes.php.

这仍然可以解决(对于oEmbed也是如此)。请参见以下示例,您可以在AJAX回调中使用该示例为\\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: 从不打电话echo do_shortcode( \'[some-short-code arg="foo"]\' ); 直接地快捷码只是编辑器的占位符。Every 短代码必须附加回调。改用回调。这样可以避免运行昂贵的正则表达式检查。

相关推荐

无法使用AJAX访问数据库中的数据

我正试图在wordpress中首次调用AJAX。我遵循了一些教程,到目前为止已经达到了这一点。但当我试图安慰的时候。将从数据库中获取的数据记录在AJAX调用中,我发现以下错误:未捕获引用错误:未定义数据代码:功能。phpfunction my_ajax_handler(){ global $wpdb; $name = $wpdb->get_results(\"SELECT * FROM username\"); echo $name;