【问题标题】:How to list posts and wrap them alphabetically?如何列出帖子并按字母顺序包装?
【发布时间】:2018-01-20 16:36:41
【问题描述】:

我的网站上有一个帖子列表,我想做的是按标题按字母顺序从 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 中的方法。

【问题讨论】:

    标签: php wordpress sorting alphabetical-sort glossary


    【解决方案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

    【讨论】:

    • 感谢您的回复。所以我必须在function.php中复制第一个代码,然后在我的页面上复制另一个?我找不到如何回显结果..你能帮我吗?
    • 回显结果,您需要将第一个代码复制到函数中,然后将第二个代码复制到您的 pag 中
    • 使用您的代码,我的所有帖子都在所有字母后面。 A:我的所有帖子 B:我的所有帖子 C:我的所有帖子...“search_prod_title”指的是什么?
    • search_prod_title 是您传递给查询的自定义参数,请使用已编辑的,只是对过滤部分进行了更改
    • 现在我只得到字母表,没有任何参考帖子。 $title 没有被定义,这可能是问题吗?
    【解决方案2】:

    抱歉,通过手机发布电视,所以可能无法正常显示

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

    $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 
    }
    ?>
    

    【讨论】:

    • @Kushboo 感谢您的回复。我不明白应该在代码中添加哪个 while 循环。使用您的代码时,我会为每个帖子重复字母...
    • 是的,但我怎样才能在我的 while 循环之外获得 $title ?
    猜你喜欢
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多