AJAX and do_shortcode

时间:2015-11-11 作者:user2581369

我知道以前有人问过这个问题。但我被困住了,找不到出路。

我正在使用Ajax将外部信息加载到我的站点。最初,所有信息都是一次加载的,但由于数据量很大,Ajax成为了一种必要。

使用第三方开发的插件从外部CMS访问信息。

在Ajax中,我必须使用插件的do_shortcode. 但它失败了。未返回任何结果。当它直接放在页面模板的代码中时,它会完美地工作。

我使用了我发现的最佳实践来创建Ajax通信(即使用wp_ajaxwp_ajax_nopriv 用于JS脚本的回调、注册、排队和本地化)。

我测试了Ajax连接,可以来回发送消息。但是如上所述,短代码是一件总是失败的事情。

我还没有联系到插件开发人员。所以我想问,在尝试将短代码与wp\\U ajax结合使用时,是否还有其他需要注意的事情。

提前谢谢。

编辑:我正在添加代码,以便它可以帮助:

在函数中。php

//  AJAX HOOKS TO LOAD PRODUCTS\' INFO
add_action(\'wp_ajax_get_product_info\', \'get_product_info\' );
add_action(\'wp_ajax_nopriv_get_product_info\', \'get_product_info\' );

// SHOULD RUN SHORTCODE TO GET PRODUCT INFORMATION AND SEND IT BACK TO JS SCRIPT
function get_product_info() {
   //Checks the nonce and kills the script if wrong
   $nonce = $_POST[\'nonce\'];
   if ( ! wp_verify_nonce( $nonce, \'return_posts\' ) )
        die ( \'Wrong nonce!\');
   //Process Info
   $pid = $_POST[\'product_id\'];   
   header(\'Content-type: text/html\');

   // Returns the shortcode
   echo do_shortcode("[ps_product_list id_product=".$pid." tpl=product-grid-exclusives.tpl]");

    // We don\'t want anything else to run
   exit;
}

// REGISTERS, LOADS & LOCALIZES product-store-ajax.js
if (!function_exists(\'load_scripts\')) {
    function load_scripts() {

        if ( !is_admin() && is_category(\'teaser-online-exclusives\') ) {

                wp_register_script( \'product-ajax\', get_stylesheet_directory_uri().\'/js/product-store-ajax.js\', array( \'jquery\' ), \'\', true );

                wp_enqueue_script(\'product-ajax\');

                wp_localize_script( 
                    \'product-ajax\', 
                    \'productajaxvars\', 
                    array( 
                        \'ajax_url\' =>  admin_url( \'admin-ajax.php\' ), 
                        \'nonce\'    =>  wp_create_nonce( \'return_posts\' ),
                        \'callback\' => \'get_product_info\'
                    ) 
                );
        }
    }
}
add_action(\'wp_enqueue_scripts\', \'load_scripts\');
和JS文件:

(function( $ ) {
    $(function() {

        $.ajax({
            url:  productajaxvars.ajax_url,
            data: { 
                action:  productajaxvars.callback,  // callback defined in functions.php
                nonce :  productajaxvars.nonce,
                product_id: 82},
                success: function( response ) {
                            alert(response);
                },
                type: "POST",
        });


    });
})( jQuery );

1 个回复
最合适的回答,由SO网友:Mark Kaplun 整理而成

Ajax运行时没有一个主要的WP\\U查询对象,因此也没有用于确定所显示页面类型的所有API。负责输出shortcode结果的代码可能正在检查is_single() 为true,因此不会将输出添加到存档页。

您可以做的是创建一个主查询对象,但查看生成短代码的代码并找出是否有一个简单的函数可以调用来完成所需的操作可能会更快。

关于您的一般策略的一点说明-您将用不可缓存的请求使服务器过载。如果您有空闲的CPU,或者只有一页,那么这可能没有问题,但在其他方面要非常小心。

相关推荐

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

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