Soporte » Guías – Resolución de problemas » Como filtrar para su visualización posts de una misma query de menu de cateogia

  • Hola a todos,

    A ver si hay alguien que me pueda ayudar. Tengo un menú secundario que esta basado en categorias custom de mi tema. Utiliza el fichero archive.php para mostar la págian de la petición. Quiero, usando la query devuelta a la carga de la página, poder ordenar en base a una segunda categoria principal cuales son los post que salen en primer lugar para sacar el resto despues paginando pero no me funciona correctamente, pues debe paginarlo por fecha en la petición y asignarlo a la pagina antes de mostrarlo. Si mofdifico la fehca del post a mas reciente, si funciona.
    Os dejo el codigo que uso para este fin, y funciona si las categorias son asignadas hoy a cada post (promodirectorio => cat=64).

    <?php
    			if (have_posts()) :
    			$post = $posts[0];
    			while (have_posts()){
    				the_post();
    				$categories = get_the_category( $post->ID );
    				$promocionada = FALSE;
    				foreach( $categories as $categorie ) if( $categorie->cat_ID == "64" ) $promocionada = TRUE;
    			if( $promocionada ){
    		?>
    		<div id="contents-wrapper" class="hideOnSearch">
    			<div class="contents">
    				<div class="thumb_results"><a href="<?php the_permalink();?>"><?php gorilla_img('medium');?></a></div>
    					<div class="result-detail-wrapper">  <!-- result detail wrapper -->
    						<h2><a  class="result-page-title" href="<?php the_permalink(); ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a></h2><br/>
    	                      <?php echo mb_substr( strip_tags( $post->post_content ),0,235) . '...';?><a  href="<?php the_permalink(); ?>" rel="bookmark" title="Permanent Link to <?php echo $post->post_title ?>"><?php _e('read more.','language');?></a><div style="clear:both"></div>
    					</div> <!--   result detail wrapper ends -->
    				</div><!-- end of .contents -->
    			</div><!-- end of #content-wrapper -->
    		<?php
    				}
    			}
    			rewind_posts();
    			while (have_posts()){
    				the_post();
    				$categories = get_the_category( $post->ID );
    				$promocionada = FALSE;
    				foreach( $categories as $categorie ) if( $categorie->cat_ID == "64" ) $promocionada = TRUE;
    				if( !$promocionada ){
    		?>
    		<div id="contents-wrapper" class="hideOnSearch">
    			<div class="contents">
    				<div class="thumb_results"><a href="<?php the_permalink();?>"><?php gorilla_img('medium');?></a></div>
    					<div class="result-detail-wrapper">  <!-- result detail wrapper -->
    						<h2><a  class="result-page-title" href="<?php the_permalink(); ?>" rel="bookmark" title="<?php the_title(); ?>"><?php the_title(); ?></a></h2><br/>
    	                      <?php echo mb_substr( strip_tags( $post->post_content ),0,235) . '...';?><a  href="<?php the_permalink(); ?>" rel="bookmark" title="Permanent Link to <?php echo $post->post_title ?>"><?php _e('read more.','language');?></a><div style="clear:both"></div>
    					</div> <!--   result detail wrapper ends -->
    				</div><!-- end of .contents -->
    			</div><!-- end of #content-wrapper -->
    		<?php
    				}
    			}
    			else: ?>
    			<div class="no-results">
    				<p><strong><?php _e('No Results Found.','language');?></strong></p>
    			</div><!-- .no-results ends -->
    		<?php endif;?>
    		<div style="clear:both"></div>
    		<?php theme_pagination( $wp_query->max_num_pages); ?>
    		</div><!-- end of #two-columns -->
Viendo 7 respuestas - de la 1 a la 7 (de un total de 7)
  • Iniciador del debate patata85

    (@patata85)

    ¿alguna idea?

    No queda muy claor lo que pretendes hacer. ¿Quieres que los posts de una categoría en concreto se coloquen al principio? ¿Sólo en la primera página?

    Yo creo que dejaría el listado tal como está, con el orden que desees, y haría un query secundario para mostrar lo que quieras al principio, a modo de widget o template part. Ordenar el query principal con un criterio primero, luego volver a ordenar los posts recibidos con otro criterio y todo esto en un listado paginado, es un poco lioso.

    Iniciador del debate patata85

    (@patata85)

    Como resumen, lo que quiero es prevalecer en ordenación a determinados post, y no por ello ocuparan solo la primera página, de una categoria determinada.
    Si no fuera lioso no pediría ayuda.
    Ya, en parte lo tengo solucionado con un plugin que me re-ordena los post por categorías y con el código que os muestro funciona «asin asin». y además no es mi mejor opción pues tengo que ejecutarlo manualmente y limpiar cachés cuando otorgo la categoria de referencia aun post.
    Gracias por tu interés.

    Antes de nada, dices que utilizas una taxonomía custom de tu theme pero en el código utilizas get_the_category(), una función que sólo funciona con la taxonomía «category» que ya viene con WordPress para las entradas o posts. No te funcionará con la taxonomía personalizada de tu theme.

    Dicho eso, al lío ;).

    Lo quería decir es que durante la solicitud a la base de datos, los posts se obtienen en un determinado orden, si luego para mostrarlos no quieres ese orden, tienes que volver a ordenar los resultados, y ahí entra el lío.

    Y con lío no me refiero a que sea más o menos difícil de hacer, si no a los múltiples conflitos que genera, como estás comprobando en tus propias carnes.

    Además, las categorías, o cualquier otra taxonomía, es un criterio para agrupar, no para ordenar. No lo olvides.

    Por ejemplo, tienes un grupo de médicos y quieres ordenarlos por su especialidad. Es imposible y no tiene sentido. ¿Puedes ordenar por «pediatras»? No. Lo que puedes hacer es agrupar a esos médicos por especialidad. Por supuesto, puedes ordenar esos grupos como quieras, por ejemplo por orden alfabético, pero el orden de los integrantes del grupo no se pueden ordenar por «grupo», no tiene sentido, espero que entiendas la diferencia.

    Si entiendes esta diferencia, puede que te sea más fácil construir el código con la lógica adecuada.

    En mi opinión, en lugar de andar con ese lío de código en los templates, puedes utilizar el filtro the_posts o el action loop_start para reagrupar los posts del query pricipal. Por ejemplo, utilizando el action loop_start algo así debería funcionar:

    add_action( 'loop_start', function( $query ) {
        if( $query->is_main_query() && $query->is_tax( 'mi_taxonomia' ) ) {
            usort( $query->posts, function( $a, $b ){
                // Si 64 el ID del termino de la
                // la taxonomía que qeires mover al pricipio
                return -1 * has_term( 64, 'mi_taxonomia', $a ) + 1 * has_term( 64, 'mi_taxonomia', $b );
    	} );
        }
    } );

    Y en el template dejas el loop normal y corriente.

    Iniciador del debate patata85

    (@patata85)

    Hola, Vaya por delante un GRACIAS MUY GRANDE

    Si encuentras algo de incongruencia en los usos de las funciones es porque aún soy «profano» en WP a este nivel. Poco a poco estoy haciendo una inmersión a través de los manuales y mis conocimientos en código.
    Dicho esto, cuando hablo de ordenar, es en la visualización. Primero los de categoría 64 y luego el resto excepto los 64. Probaré tu código y te cuento, aunque a priori creo que no en el contexto que yo quiero, porque ya viene filtrado por una category custom (como enunciaba en la pregunta inicial) y la que filtra o agrupa es una categoría WP(«…ordenar en base a una segunda categoria principal…»). Si no me he explicado en la pregunta, lo siento, porque la query ya viene filtrada por la «custom», y por tanto, lo que quiero gestionar el resultado.

    Y créeme, funciona el código que he pasado en mi pregunta al ser «category» WP o principal como he comentado, el problema es la paginación que recibe el Loop (¿se dice así?) que he solucionado momentáneamente con un plugin «Category Order and Taxonomy Terms Order» de Nsp-Code que como te comento, la versión gratuita solo lo permite hacer de forma manual (he visto que la de pago si lo hace automático)

    El código que puse funciona para cualquier loop. Si ya estás en un término específico de una taxonomía custom, y quieres aplicar el código sólo a ese término, puedes cambiar:

    $query->is_tax( 'mi_taxonomia' );

    Que identifica si estas en archivos de «mi_taxonomia» en general, con:

    $query->is_tax( 'mi_taxonomia', 'un_termino' );

    Para aplicarlo sólo si estás en el archivo de «un_termino» de la taxonomía «mi_taxonomia».

    PD: lo que explicaba de que se puede ordener por «taxonomía» no es algo de WordPress, es algo que trae el concepto de taxonomía en cualquier campo. Piensa por ejemplo en la clasificación taxónomica de plantas o animales, puedes agrupar las plantas por familias, y puedes ordenar las familias en sí mismas, pero no puedes ordenar las plantas por familias. Espero que lo entiendas lo que quiero explicar.

    Iniciador del debate patata85

    (@patata85)

    Gracias ya lo veo y te cuento

Viendo 7 respuestas - de la 1 a la 7 (de un total de 7)
  • El debate ‘Como filtrar para su visualización posts de una misma query de menu de cateogia’ está cerrado a nuevas respuestas.