it-swarm.com.de

Wie bringe ich einen bestimmten Beitrag in eine WordPress-Schleife?

Ich habe also eine WordPress-Schleife im Gange. Der folgende Code ist die Vorlagenseite für die woocommerce-Produktarchivseite. Hier ist der Anwendungsfall für das, was ich herausfinden möchte:

  • Der Benutzer wird mit der Produktarchivseite angezeigt (in Links eingeschlossene Produktminiaturen werden aufgelistet).
  • Der Benutzer klickt auf ein Miniaturbild (bei dem es sich um einen Link handelt) und gelangt auf eine andere Seite, die im Wesentlichen der aktuellen entspricht, mit der Ausnahme, dass ein Schieberegler für dieselben Produkte angezeigt wird, die auf der vorherigen Seite angezeigt wurden (Sie wissen, die Nummer) Anzahl der Beiträge auf Seite 1, Seite 2 oder Seite 3, je nachdem, auf welche Seite der Beitrag geklickt wurde).
  • Diese Seite enthält einen Schieberegler mit einer größeren Miniaturansicht aller Produkte, und das ausgewählte Produkt befindet sich am Anfang des Schiebereglers (ich muss es an den Anfang der Produktschleife für diese Seite verschieben und die anderen Beiträge neu anordnen entsprechend).

TL; DR : Um es zusammenzufassen, wie kann ich zu einer anderen Seite gehen, die genau die gleichen Beiträge bei genau der gleichen Seitenzahl hat (Seite wie in der Paginierungsposition), aber mit dem ausgewählten Beitrag am Anfang des Schleife der Seite, während die Reihenfolge der Beiträge immer noch relevant ist (wie in den Beiträgen vor dem ausgewählten Beitrag wird es immer noch davor und die danach werden immer noch danach sein)?

PS: Ich würde es vorziehen, weder eine Plugin-Lösung noch eine clientseitige Lösung zu verwenden (ich möchte, dass alles auf dem Server in PHP erledigt wird).

Zum Beispiel:

Ich bin auf Seite 5 :

Beiträge sind wie folgt: 41, 42, 43, 44, 45, 46, 47, 48, 49, 50.

Angenommen, ich habe auf 44 geklickt.

Die Seite, auf die ich gehe, hat die gleichen Schleifen, jedoch mit 44 am Anfang, und die anderen haben sich entsprechend neu angeordnet.

Die Schleife würde wie folgt lauten: 44, 45, 46, 47, 48, 49, 50, 41, 42, 43.

Dann wenn ich auf die nächste Seite geklickt habe. Da ich auf Seite 5 bin und auf 6 geklickt habe, wäre die Schleife wieder 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

Mit dem Haken 'the_posts' können Sie Beiträge bearbeiten, die in einer Schleife angezeigt werden sollen.

Es wird für alle Abfragen (die Haupt- und die Nebenabfragen) ausgelöst, daher müssen Sie überprüfen, ob die Abfrage, auf die Sie sich beziehen, die richtige ist.

Das heißt in Ihrem Fall können Sie:

  1. senden Sie eine Abfragevariable, um den ausgewählten Beitrag zu individualisieren
  2. verwenden Sie den Filter 'the_posts', um den ausgewählten Beitrag am Anfang des Beitrags-Arrays zu verschieben

1. Senden Sie eine Abfragevariable, um den ausgewählten Beitrag zu individualisieren

Post-Thumbnails sollten folgendermaßen gedruckt werden:

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

add_query_arg() Eine Abfragevariable zur aktuellen URL hinzufügen bedeutet, dass Sie auf der Seite mit der URL example.com/some/path/page/5 durch Klicken auf die Beitragsminiatur für den Beitrag mit der ID 44 an die URL example.com/some/path/page/5?psel=44 weitergeleitet werden.

Sobald die URL mit den angezeigten Beiträgen identisch ist, können Sie dank der Variablen psel urlreorderposts festlegen, dass der ausgewählte Beitrag am Anfang des Beitragsarrays angezeigt wird.

2. Verwenden Sie den Filter 'the_posts', um den ausgewählten Post am Anfang des Post-Arrays zu verschieben

Sobald Sie die ausgewählte Beitrags-ID in einer URL-Variablen haben, ist es nur eine Frage einiger Funktionen von PHP, das zugehörige Beitragsobjekt auf das Beitragsarray zu setzen

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

Der vorherige Code stellt sicher, dass die Beiträge nach Ihren Wünschen sortiert sind.

Die Funktion get_selected_post_index() kann auch in Ihren Vorlagen verwendet werden, um festzustellen, ob es einen ausgewählten Beitrag gibt oder nicht (und Ihre Vorlage entsprechend zu ändern), da sie false zurückgibt, wenn kein Beitrag ausgewählt ist (oder wenn eine falsche ID über psel url variable gesendet wird). .

5
gmazzap