¿Cómo llevar una publicación específica al frente de wordpress loop?

2

Por lo tanto, tengo un bucle de WordPress pasando. El siguiente código es la página de plantilla para la página de archivo de productos de woocommerce. Aquí está el caso de uso para lo que estoy tratando de averiguar cómo lograrlo:

  • El usuario se muestra con la página de archivo del producto (se enumeran las miniaturas del producto envueltas en enlaces).
  • El usuario haría clic en una miniatura (que es un enlace) y lo llevará a otra página que es básicamente la misma que la actual, excepto que se muestra un control deslizante de los mismos productos que aparecieron en la página anterior (usted sabe , la cantidad de publicaciones en la página que aparecieron en la página 1, en la página 2 o en la página 3, en la que se hizo clic en la publicación).
  • Esta página contendrá un control deslizante con una miniatura más grande de todos los productos, y el producto seleccionado estará al principio del control deslizante (necesito moverlo al principio del ciclo de productos para esa página y reorganizar los otros puestos en consecuencia).

TL; DR : para resumir, ¿cómo puedo ir a otra página que tenga exactamente las mismas publicaciones exactamente en el mismo número de página (página que en la ubicación de paginación), pero con la ¿publicar en el principio del bucle de la página mientras se mantiene el orden de las publicaciones aún relevantes (como en las publicaciones antes de la publicación elegida todavía estará delante de ella y las que siguen después de ella)?

PS: preferiría no usar una solución de complemento, ni una solución del lado del cliente (quiero que todo se haga en el servidor en PHP).

Por ejemplo:

Estoy en la página 5 :

Los mensajes son los siguientes: 41, 42, 43, 44, 45, 46, 47, 48, 49, 50.

Diga que hice clic en 44.

La página a la que me llevo tiene los mismos bucles pero con 44 al principio, y los demás se reorganizaron en consecuencia.

El bucle diría lo siguiente: 44, 45, 46, 47, 48, 49, 50, 41, 42, 43.

Luego si hago clic en la página siguiente. Ya que estoy en la página 5 y hago clic en 6 , el bucle volvería a ser 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');

    ?>
    
pregunta yaharga 10.01.2015 - 22:58

1 respuesta

5

El gancho de filtro 'the_posts' te permite editar las publicaciones que se mostrarán en un bucle .

Se activa para todas las consultas (la principal y las secundarias), por lo que debe verificar que la consulta en la que está actuando sea la correcta.

Dicho en tu caso, puedes:

  1. enviar una variable de consulta para individualizar la publicación seleccionada
  2. use 'the_posts' filter para mover la publicación seleccionada al principio de la matriz de publicaciones

1. Enviar una variable de consulta para individualizar la publicación seleccionada

Las miniaturas de las publicaciones deben imprimirse utilizando algo como esto:

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

add_query_arg() agrega una variable de consulta a la url actual, significa que si estás en la página que tiene la url example.com/some/path/page/5 haciendo clic en la miniatura de publicación para la publicación con ID 44, se le envía a la url example.com/some/path/page/5?psel=44 .

Una vez que la URL sea la misma, se mostrarán las mismas publicaciones, pero gracias a la variable psel url puede reordenar para que la publicación seleccionada se inicie en la matriz de publicaciones.

2. Utilice 'the_posts' filter para mover la publicación seleccionada al principio de la matriz de publicaciones

Una vez que tenga el ID de publicación seleccionado en una variable url, colocar el objeto de publicación relacionado en la matriz de publicaciones es solo una cuestión de un par de funciones 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);

El código anterior asegurará que las publicaciones se ordenen como usted quiere.

La función get_selected_post_index() también se puede usar dentro de sus plantillas para saber si hay una publicación seleccionada o no (y modificar su plantilla en consecuencia), porque devuelve false cuando no se selecciona ninguna publicación (o si hay una identificación incorrecta). se envía a través de la variable psel url).

    
respondido por el gmazzap 11.01.2015 - 17:10

Lea otras preguntas en las etiquetas