EDIT
来自OP的评论
但仍有一些问题和改进建议。首先,不确定我是否遗漏了什么,但列表中没有链接?第二,使用此列表,它输出一封信,即使它没有为该信分配帖子。。。。。
和
以数字开头的帖子不会被列出,是否有可能扩大范围?
我已经完全重写了整个代码。尽管如此,您问题中的两个代码块都有重大问题,所以我还是放弃了这两个代码块。正如@birgire所指出的,我原始答案中的代码有db查询量的缺点,因为我也包含了空字母(虽然这是您想要的)
我已经将链接设置为可点击的,并规定将数字作为排序的第一个字符。我没有详细介绍的是造型。
下面是修订后的代码
<?php
$args=array(
\'post_type\' => \'portfolio\',
\'portfolio-category\' => \'indie\',
\'orderby\' => \'title\',
\'order\' => \'ASC\',
\'posts_per_page\'=>-1,
\'ignore_sticky_posts\'=>1
);
$my_query = new WP_Query($args);
$q = array();
if( $my_query->have_posts() ) {
while ($my_query->have_posts()) {
$my_query->the_post();
$t = \'<a href="\'. get_permalink() .\'" rel="bookmark" title="Permanent Link to \'. get_the_title() .\'">\' . get_the_title() .\'</a>\';
$c = strtoupper(substr(get_the_title(),0,1));
$q[$c][] = $t;
}
}
wp_reset_postdata(); // Restore global post data stomped by the_post().
$count = 0;
foreach ($q as $key=>$values) {
$count++; ?>
<div class="column<?php echo $count; ?>" style="width:9%; margin-right:2%; float:left; margin-bottom:25px">
<?php echo $key;
foreach ($values as $value) { ?>
<div style="width:95%; padding-right:5%">
<p>
<?php echo $value; ?>
</p>
</div>
<?php } ?>
</div>
<?php if( 0 == $count%9 ){ ?>
<div class="clear" style="clear:left"></div>
<?php }
}
这是上面代码的输出
一一八<从原始答案中删除所有内容。我保留原始答案是为了它的完整性,并且它将来可能对其他人有用。
根据您的需要添加您自己的样式和样式
根据您的个人需要进行任何修改
我已经为您提供了满足您需求的骨干力量。我预计这将至少需要99%才能实现你的目标。请告诉我你的进度
ORIGINAL ANSWER
我走了一条与您在示例中所走的不同的路线。以下是我所做的以及它的工作原理:
STEP 1
@birgire 做
this post 刚才关于扩展
WP_Query
类,该类使您能够按首字母检索邮件。是通过引入新参数来完成的,
name__like
. 我用它创建了自定义查询。这是新班级
/**
* Class WPSE_Query
*
* Add a support for the name__like parameter
*
* @link https://wordpress.stackexchange.com/a/136758/26350
*
*/
class WPSE_Query extends WP_Query
{
public function __construct( $args = array() )
{
add_filter( \'posts_where\', array( $this, \'posts_where\' ), 10, 2 );
parent::__construct( $args );
}
public function posts_where( $where, $qry )
{
remove_filter( current_filter(), array( $this, __FUNCTION__ ) );
$name__like = $qry->get( \'name__like\' );
if( ! empty( $name__like ) )
{
$where .= " AND ";
$where .= $GLOBALS[\'wpdb\']->posts;
$where .= ".post_name LIKE \'";
$where .= esc_sql( like_escape( $name__like ) );
$where .= "%\' ";
}
return $where;
}
}
这将进入您的功能。php。
STEP 2
为了动态检索字母表中所有字母的列表,我使用了php函数
range()
并为其分配了一个变量。
$range = range(\'A\',\'Z\');
STEP 3
然后我通过
foreach
循环以获取所有单个字母,并将其传递给我的自定义查询
foreach ($range as $r){ }
STEP 4
而不是使用
WP_Query
, 我现在使用了在步骤1中创建的新类,名为
WPSE_Query
. 我还使用了新参数
name__like
并将字母表中的每个字母传递给它,以便相应地检索我的帖子
$args = array(
\'post_type\' => \'portfolio\',
\'orderby\' => \'title\',
\'order\' => \'ASC\',
\'posts_per_page\' => -1,
\'portfolio-category\' => \'indie\',
\'ignore_sticky_posts\' => 1,
\'name__like\' => $r
);
// The Query
$the_query = new WPSE_Query( $args );
我之所以经历这些麻烦,是为了让我对HTML有更多的控制
STEP 5
我引入了一个计数器来控制何时引入HTML元素以及它们的高级方式
STEP 6
为了创建列并设置其样式,我使用了以下行<注意:我在这里使用内联样式只是为了展示输出。您应该将这些样式添加到样式表中,而不是将其保留为内联样式
<div class="column<?php echo $count; ?>" style="width:9%; margin-right:2%; float:left; margin-bottom:25px">
如您所见,我在这里使用计数器在每次迭代中将我的column类前进一个
STEP 7
最后,要停止任何古怪的输出,您需要在每第九个post之后清除浮点。使用计数器和
modulus division operator, 每九根立柱后插入一个透明浮子
if( 0 == $count%9 ){ ?>
<div class="clear" style="clear:left"></div>
<?php }
ALL TOGETHER NOW!
这是最终代码:
<?php
$count = 0;
$range = range(\'A\',\'Z\');
foreach ($range as $r){
$count++;
?>
<div class="column<?php echo $count; ?>" style="width:9%; margin-right:2%; float:left; margin-bottom:25px">
<?php
echo \'<p>\' .$r . \'</p>\';
// $args for the custom query
$args = array(
\'post_type\' => \'portfolio\',
\'orderby\' => \'title\',
\'order\' => \'ASC\',
\'posts_per_page\' => -1,
\'portfolio-category\' => \'indie\',
\'ignore_sticky_posts\' => 1,
\'name__like\' => $r
);
// The Query
$the_query = new WPSE_Query( $args );
// The Loop
if ( $the_query->have_posts() ) {
while ( $the_query->have_posts() ) {
$the_query->the_post();
?>
<div style="width:95%; padding-right:5%">
<p>
<?php the_title(); ?>
</p>
</div>
<?php
}
}
wp_reset_postdata(); ?>
</div>
<?php
if( 0 == $count%9 ){ ?>
<div class="clear" style="clear:left"></div>
<?php }
}
?>
您所需要做的就是调整和添加所有相关的HTML标记
这是上面代码的输出
下面是HTML结构