如何使用AJAX获取模板部件?

时间:2015-01-13 作者:yaserso

我目前正在使用Woocommerce存档产品。php模板文件(比如商店页面或产品类别页面)。单击文章(或产品)后,将向同一页面的标题添加GET查询,将页面更改为滑块而不是文章列表。我需要使用AJAX更改页面的内容,而不是刷新和添加GET查询。我尝试包含模板部分,但它一直说找不到帖子。

我一直在读,我可能需要加载wp-load。php或其他方法。最有效的方法是什么?我想学习如何获取\\u template\\u part()以返回特定URL上的内容。(稍后我需要使用类似的方法检索single-product.php)。

下面是我的AJAX服务器端脚本:

// AJAX function to show slider on product archive
function cienna_show_slider_callback() {
  define(\'WP_USE_THEMES\', false);
  require_once($_SERVER[\'DOCUMENT_ROOT\'].\'/wp/wp-load.php\');
  get_template_part( \'woocommerce/archive\', \'product\' );
  wp_die();
}
add_action( \'wp_ajax_cienna_show_slider\', \'cienna_show_slider_callback\' );
add_action( \'wp_ajax_nopriv_cienna_show_slider\', \'cienna_show_slider_callback\' );
这是我的AJAX客户端脚本(我不包括额外的GET变量,以免混淆任何人;我只希望模板页面能够像访问其页面一样自然地工作):

// JavaScript to be fired on the product archive page
$(\'ul.products li.product a\').on(\'click\', function(event) { // AJAX get content of page
  event.preventDefault();
  $.get( ajax_object.ajax_url, { action: "cienna_show_slider" }, function( data ) {
    console.log(data);
  })
});
万一有人问起,以下是存档产品模板:

<?php get_template_part(\'templates/page\', \'header\');

    /**
    * woocommerce_before_main_content hook
    *
    * @hooked woocommerce_output_content_wrapper - 10 (outputs opening divs for the content)
    * @hooked woocommerce_breadcrumb - 20
    */
    do_action(\'woocommerce_before_main_content\');

    do_action( \'woocommerce_archive_description\' );

    if ( have_posts() ) {

        /**
         * woocommerce_before_shop_loop hook
         *
         * @hooked woocommerce_result_count - 20
         * @hooked woocommerce_catalog_ordering - 30
         */
        do_action( \'woocommerce_before_shop_loop\' );

        woocommerce_product_loop_start();

        woocommerce_product_subcategories();

        while ( have_posts() ) {

            the_post();

            get_template_part( \'woocommerce/content\', \'product\' );

        }

        woocommerce_product_loop_end();

        /**
         * woocommerce_after_shop_loop hook
         *
         * @hooked woocommerce_pagination - 10
         */
        do_action( \'woocommerce_after_shop_loop\' );

    } elseif ( ! woocommerce_product_subcategories( array( \'before\' => woocommerce_product_loop_start( false ), \'after\' => woocommerce_product_loop_end( false ) ) ) ) {

    wc_get_template( \'loop/no-products-found.php\' );

    }

  /**
   * woocommerce_after_main_content hook
   *
   * @hooked woocommerce_output_content_wrapper_end - 10 (outputs closing divs for the content)
   */
  do_action(\'woocommerce_after_main_content\');

?>
UPDATE: 所以,自从我从$更新了AJAX调用以来。ajax到美元。获取并包含wp-load,它运行良好,只是它仍然不断地说找不到帖子。

1 个回复
SO网友:Mohammed

您的回调函数必须如下所示:

function cienna_show_slider_callback() {
    global $post, $product, $woocommerce; // just in case if your template file need this
    ob_start();
?>

<?php woocommerce_get_template( \'archive-product.php\'); ?>

<?php
    $output = ob_get_contents();
    ob_end_clean();
    echo $output;
    die();
}

结束

相关推荐

使用JS substr()的AJAX成功函数在WP 4.1和4.0中失败

多年来,我在我的插件中设置了php ajax调用和响应,如下所示,并根据需要设置了js错误检测条件,如。。。if( \"<e>\" == msg.substr(0, 3) ) { do_something(); } 然而,自WP 4.1起,substr不再对响应字符串起作用,尽管split起作用。为什么?我认为两者之间唯一的主要区别在于jquery/ui,但我认为这不会影响ajax响应?MY_AJAX.PHP<?php die(\"<e>Foo\")