it-swarm.dev

Come portare un post specifico di fronte al ciclo di wordpress?

Quindi, ho un ciclo WordPress in corso. Il codice seguente è la pagina modello per la pagina di archivio dei prodotti woocommerce. Ecco il caso d'uso per ciò che sto cercando di scoprire come ottenere:

  • L'utente viene visualizzato con la pagina di archivio del prodotto (le anteprime dei prodotti racchiuse nei collegamenti sono elencate).
  • L'utente farebbe clic su una miniatura (che è un collegamento) e lo porterà su un'altra pagina che è fondamentalmente la stessa di quella corrente, tranne che viene mostrato un cursore degli stessi prodotti che appaiono nella pagina precedente (sapete, il numero di post sulla pagina che sono stati visualizzati a pagina 1, pagina 2 o pagina 3, a seconda di dove si trovava il post su cui si è fatto clic).
  • Questa pagina conterrà uno slider con una miniatura più grande di tutti i prodotti, e il prodotto selezionato sarà all'inizio del cursore (ho bisogno di spostarlo all'inizio del ciclo di prodotti per quella pagina e riorganizzare gli altri post di conseguenza).

TL; DR : per riassumere, come posso andare su un'altra pagina che ha esattamente gli stessi post allo stesso identico numero di pagina (pagina come in posizione di impaginazione), ma con il post selezionato all'inizio del ciclo della pagina mantenendo l'ordine dei post ancora rilevante (come nei post prima che il post scelto sarà ancora prima di esso e quelli dopo sarà ancora dopo esso)?

PS: Preferirei non utilizzare una soluzione plug-in, né una soluzione lato client (lo voglio tutto fatto sul server in PHP).

Ad esempio:

Sono sulla pagina 5 :

I messaggi sono i seguenti: 41, 42, 43, 44, 45, 46, 47, 48, 49, 50.

Diciamo che ho cliccato su 44.

La pagina che ho preso ha gli stessi loop ma con 44 all'inizio, e gli altri sono stati riorganizzati di conseguenza.

Il ciclo dovrebbe essere come segue: 44, 45, 46, 47, 48, 49, 50, 41, 42, 43.

Quindi se ho cliccato sulla pagina successiva. Dato che sono sulla pagina 5 e cliccato su 6 , il ciclo sarebbe di nuovo normale: 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

L'hook del filtro 'the_posts' consente di modificare i post che verranno visualizzati in un loop.

È attivato per tutte le query (principale e secondaria), quindi è necessario verificare che la query su cui si sta agendo sia quella giusta.

Ciò detto nel tuo caso puoi:

  1. invia una variabile di query per individuare il post selezionato
  2. usa il filtro 'the_posts' per spostare il post selezionato all'inizio dell'array post

1. Invia una variabile di query per individuare il post selezionato

Le miniature dei post devono essere stampate usando qualcosa di simile a questo:

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

add_query_arg() aggiungi una variabile di query all'URL corrente, vuol dire che se sei nella pagina che ha l'url example.com/some/path/page/5 facendo clic sulla miniatura del post per il post con ID 44 sei stato inviato all'URL example.com/some/path/page/5?psel=44.

Una volta che l'url è uguale, gli stessi post mostrati saranno uguali, ma grazie alla variabile psel url puoi riordinare i post per avere il post selezionato all'inizio dell'array post.

2. Usa il filtro 'the_posts' per spostare il post selezionato all'inizio dell'array post

Una volta che hai selezionato l'id del post in una variabile url, mettere l'oggetto post correlato sopra l'array posts è solo questione di un paio di PHP funzioni

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

Il codice precedente assicurerà che i post siano ordinati come vuoi tu.

La funzione get_selected_post_index() può essere utilizzata anche nei tuoi template per sapere se c'è un post selezionato o meno (e modificare il tuo template di conseguenza), perché restituisce false quando nessun post è selezionato (o se un Id errato viene inviato tramite la variabile url psel) .

5
gmazzap