web-dev-qa-db-fra.com

Comment get_template_part en utilisant AJAX?

Je suis actuellement dans le fichier modèle Woocommerce archive-product.php (par exemple, page de magasin ou page de catégorie de produit). Au clic de la publication (ou du produit), une requête GET est ajoutée au titre de la même page, transformant la page en un curseur au lieu d'une liste de publications. J'ai besoin de changer le contenu de la page en utilisant AJAX, au lieu d'actualiser et d'ajouter une requête GET. J'ai essayé d'inclure la partie modèle, mais il continue de dire qu'aucune publication n'est trouvée.

Je continue à lire que je pourrais avoir besoin de charger wp-load.php ou une autre méthode. Quelle est la méthode la plus efficace pour le faire? Je veux apprendre à la méthode get_template_part () à me renvoyer ce qu'elle renverrait sur une URL spécifique. (J'aurai besoin de récupérer le single-product.php plus tard en utilisant une méthode similaire).

Voici mon script côté serveur pour 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' );

Voici mon script côté client pour le AJAX (je n'inclus pas la variable supplémentaire GET pour ne confondre personne; je veux simplement que la page de modèle fonctionne aussi naturellement que si sa page était visitée):

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

Juste au cas où quelqu'un le demanderait, voici le modèle de produit archive:

<?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: Donc, depuis que j'ai mis à jour l'appel AJAX de $ .ajax à $ .get et que wp-load est inclus, tout se passe bien, sauf qu'il continue de dire qu'aucun message n'a été trouvé.

1
yaharga

votre fonction de rappel doit être comme ceci:

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