No puedes hacer este tipo de clasificación dentro del bucle. Sin embargo, puedes hacerlo escribiendo tu propia función
Aquí está mi solución: ¡PS! Necesita PHP 5.4+
PASO 1
Crea una función llamada wpse161553_loop_sort($tag='')
. Esto funcionará con una sola etiqueta con la consulta principal.
PASO 2
Es necesario obtener los objetos de publicación de la consulta principal. Ya están disponibles y solo se puede acceder a ellos mediante $wp_query->posts;
. (Para obtener una lista completa de los objetos disponibles y cómo acceder a ellos, consulte WP_Post
).
PASO 3
Crea e inicia un nuevo contador. Este contador se utilizará para alterar las claves de la matriz de $wp_query->posts;
más adelante.
PASO 4
Obtenga la opción posts_per_page
establecida en el back-end. Este valor se agregará al contador para todas las publicaciones que no tengan la etiqueta deseada. Esto hará avanzar todas estas publicaciones más allá de las publicaciones de etiqueta deseadas
PASO 5
Dentro del bucle, usa has_tag()
para comparar cada publicación con la etiqueta deseada. Si una publicación tiene una etiqueta deseada, presione el valor del contador actual a una matriz ( $c
) como está. Si una publicación no tiene la etiqueta deseada, presione el valor del contador actual más el valor posts_per_page
a $c
PASO 6
Use array_combine
para combinar las dos matrices juntas. La nueva matriz creada $c
reemplazará las claves de matriz de la matriz de publicaciones
STEP 7
Use ksort
para ordenar la nueva matriz creada con array_combine
de acuerdo con las nuevas claves . Ahora esto ordenará la matriz para que las publicaciones se ordenen por fecha de publicación, y también, la publicación de la etiqueta deseada aparecerá primero, luego el resto de las publicaciones
Paso 8
Use array-values
para restablecer las claves de nuevo para comenzar en 0
e incrementar numéricamente por uno
PASO 9
Rebobina el bucle para que podamos volver a ejecutarlo
PASO 10
Desactive la matriz original dentro de $wp_query->posts
y reemplácela con la nueva matriz creada. $wp_query->posts
ahora tendrá una matriz con el nuevo orden de envío ordenado
¡TODOS JUNTOS AHORA!
El siguiente código entra en tus funciones.php
function wpse161553_loop_sort($tag='') {
global $wp_query;
$posts = $wp_query->posts; // Gets all post data from the main query
$c = []; // Going to hold an array of new keys for later use
if ( have_posts() ) {
$count = 0; //Start the counter
$ppp = get_option('posts_per_page'); // Gets the backend posts per page option set. Will be used in conjustion with the counter
while ( have_posts() ) {
the_post();
if( '' != $tag && has_tag($tag)) { // This will be the tag to test against, your desired tag
$c[] = $count++;
}else{
$c[] = $ppp + $count++; // Adds posts per page value to each count to advance posts without desired tag past desired tag
}
}
}
$posts_reordered = array_combine( $c, $posts ); // Reset each post from main query's key with the new keys created by $c
$posts_sorted = ksort($posts_reordered); // Sort the new array according to key
$posts_reordered = array_values($posts_reordered); // Reset keys to start at zero and increment by one
rewind_posts(); // Reset the loop so we can run the loop again
unset($wp_query->posts); //unset the original $wp_query->posts object array
$wp_query->posts = $posts_reordered; // Set $wp_query->posts to the new reordered array
}
CÓMO SE UTILIZARÁ
En su category.php, o para el caso, en cualquier plantilla, pegue lo siguiente justo encima del bucle. No necesitas cambiar nada más
wpse161553_loop_sort( 'NAME OF THE TAG TO APPEAR FIRST' );
donde NAME OF THE TAG TO APPEAR FIRST
es el nombre de la etiqueta deseada en la que aparecerán primero las publicaciones