如何列出帖子并按字母顺序包装?

时间:2018-01-20 16:36:42

标签: php wordpress sorting alphabetical-sort glossary

我的网站上有一个帖子列表,我要做的是按照字母顺序将它们从A-Z换成标题,以获得这样的词汇表:

A.
Apple

B.
Banana

C.
Carotts

D.

E.

F.

G.
Grenada

等等直到字母z。

我希望即使没有帖子也要显示这封信。

我希望将结果包装在这个结构中:

<div class="group_letter">
<div class="letter">A</div>
<div class="post">Apple</div>
</div>

<div class="group_letter">
<div class="letter">B</div>
<div class="post">Banana</div>
</div>

这是我到目前为止所得到的:

<?php 
$letter=' '; 
query_posts( array ( 'post_type' => 'auteurs', 'orderby' => 'title', 'order' => 'ASC' ) );
if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>

<?php 
$title=get_the_title(); 
$initial=strtoupper(substr($title,0,1));
if($initial!=$letter) {
echo "<div>$initial</div>";
$letter=$initial;
}

echo "<div class='post'>" . $title. "</div>";
?>

<?php endwhile; endif; wp_reset_query(); ?>

结果如下:

<div class='letter'>A</div>
<div class='post'>Apple</div>

<div class='letter'>B</div>
<div class='post'>Banana</div>

<div class='letter'>C</div>
<div class='post'>carotts</div>

<div class='letter'>G</div>
<div class='post'>Grenanda</div>

我有两个问题:

  1. 不显示空字母。
  2. 我找不到在group_letter div内包装论坛的方法。

2 个答案:

答案 0 :(得分:1)

我会用WP_Query上的过滤器来解决这个问题。一个检测额外查询变量的。  将其添加到您的functions.php

add_filter( 'posts_where', 'title_filter', 10, 2 );
function title_filter( $where, &$wp_query )
 {
  global $wpdb;
   if ( $search_term = $wp_query->get( 'search_prod_title' ) ) {
    $where .= ' AND ' . $wpdb->posts . '.post_title LIKE \'%' . esc_sql( $wpdb->esc_like( $search_term ) ) . '%\'';
}
return $where;
}

一旦你有过滤器,你可以使用wp_query和字母数组范围

foreach (range('A', 'Z') as $char) {
echo '<div class="group_letter">';
echo '<div class="letter">'.$char.'</div>';
$args = array(
'post_type' => 'auteurs',
'posts_per_page' => -1,
'search_prod_title' => $char,
'post_status' => 'publish',
'orderby'     => 'title', 
'order'       => 'ASC'
 );
$the_query = new WP_Query($args);
if ( $the_query->have_posts() ) :
 while ( $the_query->have_posts() ) : $the_query->the_post();
$title=get_the_title(); 
$initial=strtoupper(substr($title,0,1));
if($initial==$char) {
 echo "<div class='post'>" . $title. "</div>";
 }
endwhile;
wp_reset_postdata();  
endif;
echo '</div>';
}
remove_filter( 'posts_where', 'title_filter', 10, 2 );

我没有测试过这段代码,我希望它能够正常运行。 您可以获得有关Wp_query https://codex.wordpress.org/Class_Reference/WP_Query

的更多信息

答案 1 :(得分:0)

抱歉,从手机上播放电视,可能无法正常显示

首先,您必须创建一个包含所有字母的数组。

$alph = array('A', 'B', 'C',.... 'Z'); 



<

?php 
$title=get_the_title(); 
foreach($alph as $key) {
// add while loop here
initial=strtoupper(substr($title,0,1));
if($initial!=$key) {
echo '<div class="group_letter">';
echo "<div>$key</div>";
}else{

echo "<div class='post'>" . $title. "</div>";
}
echo "</div>";
// end while loop here 
}
?>