按字母顺序垂直张贴的栏目

时间:2014-08-25 作者:user2059370

我需要创建一个9列列表,输出按垂直和字母顺序排序的帖子。我越来越近了,但还是不在那里。我有两个独立的循环。

第一个循环我有我想要的方式,按字母排序,并按字母顺序排列在表格中。这里的问题是,我只是不能得到正确的样式。

我用过的第二个wp_query_columns 功能来自here. 有了这个,我得到了一个正确排序的循环float:left 我把它调好了。这里缺少的是,我需要为每行设置一个预先确定的数字集,在这里我需要它是动态的,并且我需要它按照字母排序,就像第一个示例一样。

在过去的几天里,我尝试了很多方法来做到这一点,但我很困惑。他们似乎都在正确的轨道上,不确定我应该与哪一位合作。您可以看到两个输出here (向下滚动第二个)

回路1

<?php

$last_char = \'\';
$args=array(
\'post_type\' => \'portfolio\',
\'orderby\' => \'title\',
\'order\' => \'ASC\',
\'posts_per_page\'=>-1,
\'portfolio-category\' => \'indie\',
\'ignore_sticky_posts\'=>1
);

$my_query = new WP_Query($args);

$columnCount = 0;

?>

<?php if( $my_query->have_posts() ) : ?>
<?php  echo \'Alphabetic index of all \' . count($my_query->posts) . \' posts\'; ?>

<table>
               <?php while ($my_query->have_posts()) : ?>
            <?php if ($columnCount == 8): ?>


            <?php endif; ?>


            <?php $my_query->the_post(); ?>
            <?php $this_char = strtoupper(substr($post->post_title,0,1));  

           if ($this_char != $last_char) : ?>
 </table></td><td>
 <?php   $last_char = $this_char; ?>
 <h2> <?= $last_char; ?></h2>
 <table>
 <?php else: ?>
     <tr><td><p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to    <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p></td></tr>

 <?php endif; ?>
                      <?php endwhile; ?>  
        <?php if ($columnCount != 8): ?>
            </tr><!-- Make sure the last row gets closed. -->

        <?php endif; ?>
</table>
<?php endif; ?>

<?php wp_reset_query();  // Restore global post data stomped by the_post(). ?>
循环2

<?php

 $args=array(
\'post_type\' => \'portfolio\',
\'orderby\' => \'title\',
\'order\' => \'ASC\',
\'posts_per_page\'=>-1,
\'portfolio-category\' => \'indie\',
\'gnore_sticky_posts\'=>1
);



$the_query = new WP_Query($args);
foreach(new WP_Query_Columns($the_query, 15) as $column_count) : ?>

<ul>
    <?php while ($column_count--) : $the_query->the_post(); ?>
    <li><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></li>
    <?php endwhile; ?>
 </ul>
<?php endforeach; ?>

1 个回复
SO网友:Pieter Goosen

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 } 
}
这是上面代码的输出

enter image description here一八<从原始答案中删除所有内容。我保留原始答案是为了它的完整性,并且它将来可能对其他人有用。

根据您的需要添加您自己的样式和样式

根据您的个人需要进行任何修改

我已经为您提供了满足您需求的骨干力量。我预计这将至少需要99%才能实现你的目标。请告诉我你的进度

ORIGINAL ANSWER

我走了一条与您在示例中所走的不同的路线。以下是我所做的以及它的工作原理:

STEP 1

@birgirethis 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标记

这是上面代码的输出

enter image description here

下面是HTML结构

enter image description here

结束