web-dev-qa-db-fra.com

Comment amener un message spécifique devant Wordpress Loop?

Donc, j'ai une boucle WordPress en cours. Le code ci-dessous est la page modèle de la page d’archive du produit woocommerce. Voici le cas d'utilisation de ce que j'essaie de savoir comment réaliser:

  • L'utilisateur est affiché avec la page d'archive du produit (les miniatures du produit sont regroupées dans des liens).
  • L'utilisateur cliquerait sur une vignette (qui est un lien) et il se dirigera vers une autre page qui est fondamentalement la même que la page actuelle, sauf qu'un curseur présente les mêmes produits que ceux de la page précédente (vous savez, le des publications de la page figurant à la page 1, à la page 2 ou à la page 3, quelle que soit la publication sur laquelle vous avez cliqué).
  • Cette page contiendra un curseur avec une plus grande vignette de tous les produits. Le produit sélectionné sera placé au début du curseur (je dois le déplacer au début de la boucle de produits pour cette page et réorganiser les autres articles. en conséquence).

TL; DR : Pour résumer, comment puis-je accéder à une autre page comportant exactement les mêmes publications sous le même numéro de page (page comme dans emplacement de la pagination), mais avec le message sélectionné au début de la boucle de la page tout en conservant l'ordre des messages toujours pertinent (comme dans les messages avant que le message choisi soit toujours devant lui et ceux après il sera toujours après il)?

PS: Je préférerais ne pas utiliser de solution de plug-in, ni de solution côté client (je veux que tout soit fait sur le serveur en PHP).

Par exemple:

Je suis à la page 5 :

Les postes sont les suivants: 41, 42, 43, 44, 45, 46, 47, 48, 49, 50.

Disons que j'ai cliqué sur 44.

La page sur laquelle je suis dirigé a les mêmes boucles mais avec 44 au début et les autres réorganisées en conséquence.

La boucle se lirait comme suit: 44, 45, 46, 47, 48, 49, 50, 41, 42, 43.

Ensuite, si j'ai cliqué sur la page suivante. Depuis que je suis sur la page 5 et cliqué sur 6 , la boucle serait à nouveau normal: 51, 52, 53 ...

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

        ?>

        <li>

            <?php get_template_part( 'woocommerce/content', 'product' );

        </li>

        <?php
        }
        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');

    ?>
2
yaharga

Le crochet de filtre 'the_posts' vous permet de modifier les publications à afficher en boucle.

Il est déclenché pour toutes les requêtes (principale et secondaire). Vous devez donc vérifier que la requête sur laquelle vous agissez est la bonne.

Cela dit dans votre cas, vous pouvez:

  1. envoyer une variable de requête pour individualiser le message sélectionné
  2. utiliser le filtre 'the_posts' pour déplacer le message sélectionné au début du tableau de messages

1. Envoyer une variable de requête pour individualiser le message sélectionné

Les miniatures des publications doivent être imprimées en utilisant quelque chose comme ceci:

<a href="<?php esc_url( add_query_arg( array('psel' => get_the_ID() ) ) ) ?>">
  <?php the_thumbnail() ?>
</a>

add_query_arg() ajoute une variable de requête à l'URL actuelle, cela signifie que si vous êtes sur la page qui contient l'URL example.com/some/path/page/5 en cliquant sur la vignette de ce message avec l'ID 44, vous êtes envoyé à l'URL example.com/some/path/page/5?psel=44.

Une fois que l'URL est identique, les articles affichés seront les mêmes, mais grâce à la variable psel url, vous pouvez réorganiser les articles pour que l'article sélectionné soit placé au début du tableau.

2. Utilisez le filtre 'the_posts' pour déplacer le message sélectionné au début du tableau de messages.

Une fois que vous avez l'ID de publication sélectionné dans une variable d'URL, placer un objet de publication associé au-dessus du tableau de publications ne nécessite que quelques fonctions PHP.

function get_selected_post_index() {
  $selID = filter_input(INPUT_GET, 'psel', FILTER_SANITIZE_NUMBER_INT);
  if ($selID) {
    global $wp_query;
    return array_search($selID, wp_list_pluck($wp_query->posts, 'ID'), true);
  }
  return false;
}

add_filter('the_posts', function($posts, $wp_query) {

  // nothing to do if not main query or there're no posts or no post is selected
  if ($wp_query->is_main_query() && ! empty($posts) && ($i = get_selected_post_index())) {
      $sel = $posts[$i]; // get selected post object
      unset($posts[$i]); // remove it from posts array
      array_unshift($posts, $sel); // put selected post to the beginning of the array
  }

  return $posts;

}, 99, 2);

Le code précédent garantit que les messages sont classés comme vous le souhaitez.

La fonction get_selected_post_index() peut également être utilisée dans vos modèles pour savoir s’il existe une publication sélectionnée ou non (et modifier votre modèle en conséquence), car elle renvoie false lorsque aucune publication n’est sélectionnée (ou si un mauvais identifiant est envoyé via la variable psel url). .

5
gmazzap