0

我的网站上有一个帖子列表,我想做的是按标题从 AZ 按字母顺序将它们包装起来,以获得这样的词汇表:

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
4

2 回答 2

3

我会用 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

于 2018-01-20T17:40:26.360 回答
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 
}
?>
于 2018-01-20T17:23:02.933 回答