不能在循环内进行这种类型的排序。但是,您可以通过编写自己的函数来完成
这是我的解决方案:PS!需要PHP 5.4+
STEP 1
创建一个名为
wpse161553_loop_sort($tag=\'\')
. 这将在主查询中使用单个标记。
STEP 2
您需要从主查询中获取post对象。它们已经可用,可以通过访问
$wp_query->posts;
. (有关可用对象的完整列表以及如何访问它们,请参见
WP_Post
).
STEP 3
创建并启动新计数器。此计数器将用于从
$wp_query->posts;
过后
STEP 4
获取
posts_per_page
在后端设置选项。该值将添加到所有没有所需标签的帖子的计数器中。这将使所有这些帖子超过所需的标签帖子
STEP 5
在循环内部,使用
has_tag()
对照所需标签检查每个帖子。如果post具有所需的标记,请将当前计数器值推送到数组中(
$c
) 按原样。如果贴子没有所需的标记,则按下当前计数器的值加上
posts_per_page
值到
$c
STEP 6
使用
array_combine
将两个阵列组合在一起。新创建的数组
$c
将替换帖子数组的数组键
STEP 7
使用
ksort
对使用创建的新数组进行排序
array_combine
根据新钥匙。现在,这将对数组进行排序,以便按帖子日期对帖子进行排序,并且首先显示所需标记中的帖子,然后显示其余帖子
Step 8
使用array-values
将按键重置回起始位置0
并在数字上增加1
STEP 9
倒带循环以便我们可以重新运行循环
STEP 10
取消设置内部的原始数组
$wp_query->posts
并将其替换为创建的新阵列。
$wp_query->posts
现在将保存一个包含新订购的post order的数组
ALL TOGETHER NOW!!
下面的代码用于您的函数。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
}
HOW IT WILL BE USED
在您的类别中。php或任何模板都可以将以下内容粘贴到循环上方。你不需要再做任何改变
wpse161553_loop_sort( \'NAME OF THE TAG TO APPEAR FIRST\' );
在哪里
NAME OF THE TAG TO APPEAR FIRST
是所需标签的名称,贴子将首先显示