根据帖子的首字母列出帖子

时间:2013-07-07 作者:Shahinul Islam

我要添加分页

如何在两个循环上都执行此操作。php和搜索。php。例如,我想显示字母索引,只搜索起始字母为[E]的帖子。现在,如果我用E it搜索任何匹配项,title+content+part of title.

[A] [乙][丙][丁][E] [F] 【G】【H】【I】【J】【K】【L】【M】【N】【O】【P】。。。。。。。[Z]

Easy Post Title - 2013年由管理员发布

发布内容。。。。呜呜呜呜。。。

Example Post - Another Test - 2013年由管理员发布

发布内容。。。。呜呜呜呜。。。

[A] [乙][丙][丁][E] [F] 【G】【H】【I】【J】【K】【L】【M】【N】【O】【P】。。。。。。。[Z]

2 个回复
SO网友:Daniel Foltynek

这是我从here, 但我不记得确切的页码,这是我的工作页码letter B 在我的网站上(使用与下面相同的代码)

<?php
/*
Template Name: Locali per lettera

A WordPress template to list page titles by first letter.

You should modify the CSS to suit your theme and place it in its proper file.
Be sure to set the $posts_per_row and $posts_per_page variables.
*/

$posts_per_row = 3;
$posts_per_page = -1;
$pageURL = \'http\';
$post_type = \'post\';

if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
$pageURL .= "://";
if ($_SERVER["SERVER_PORT"] != "80") {
 $pageURL .= $_SERVER["SERVER_NAME"].":".$_SERVER["SERVER_PORT"].$_SERVER["REQUEST_URI"];
} else {
 $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
}

$letters = $wpdb->get_col(
"SELECT DISTINCT LEFT(post_title,1) AS first_letter FROM $wpdb->posts
WHERE post_type = \'$post_type\' AND post_status = \'publish\'
ORDER BY first_letter ASC"
);

$first_letter = ($_GET[\'first_letter\']) ? $_GET[\'first_letter\'] : $letters[0];
?>

<?php get_header(); ?>

 <style type="text/css">
 .letter-group { width: 100%; border-top: 1px solid #444; }
  .navigation { text-align: center; padding:5px; margin: 0 10px;} 
 .letter { display:inline; color:#DDD;text-align: center; padding: 2px; border-top: 1px solid #48465B; border-left: 1px solid #48465B; background: #18181C; margin: 0 1px;} 
 .letter a{ color:#DDD;} 
 .letter-cell { width: 5%; color:red; font-weight:bold; height: 2em; text-align: center; padding-top: 8px; margin-bottom: 8px; border-top: 1px solid #48465B; background: #18181C; float: left; }
 .row-cells { width: 94%; float: right;  }
 .title-cell { width: 33%;  float: left; overflow: hidden; margin-bottom: 8px; }
.alignleft {
    float: left;
    margin-left: 25px;
}
.alignright {
    float: right;
    margin-right: 25px;
}
 .clear { clear: both; }
 div#a-z .padder {
    border-right: none;
    margin-right: none;
    padding: 20px 40px;
}
 </style>

<div id="main-background">

   <div id="main-column">
    <br />
      <h2><?php the_title(); ?></h2>

      <div class="margin-top"></div>

      <div id="a-z">

         <?php
         $mam_global_where = " AND LEFT(post_title,1) = \'$first_letter\' ";
         $paged = (get_query_var(\'paged\')) ? get_query_var(\'paged\') : 1;
         $args = array (
            \'posts_per_page\' => $posts_per_page,
            \'post_type\' => $post_type,
            \'orderby\' => \'title\',
            \'order\' => \'ASC\',
            \'paged\' => $paged,
            \'caller_get_posts\' => 1
         );
         query_posts($args);
         $mam_global_where = \'\';  // Turn off filter
         if ( have_posts() ) {
            $in_this_row = 0;
            while ( have_posts() ) {
               the_post();
               $first_letter = strtoupper(substr(apply_filters(\'the_title\',$post->post_title),0,1));
               if ($first_letter != $curr_letter) {
                  if (++$post_count > 1) {
                     end_prev_letter();
                  }
                  start_new_letter($first_letter);
                  $curr_letter = $first_letter;
               }
               if (++$in_this_row > $posts_per_row) {
                  end_prev_row();
                  start_new_row();
                  ++$in_this_row;  // Account for this first post
               } ?>
               <div class="title-cell"><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"> <?php the_title(); ?></a></div>
            <?php }
            end_prev_letter();
            ?>
            <div class="navigation">
            <?php
            foreach ($letters as $letter) {
               $url = add_query_arg(\'first_letter\',$letter,$pageURL);
               echo "<div class=\'letter\'>";
               echo "<a href=\'$url\' title=\'Starting letter $letter\' > $letter </a>";
               echo "</div>";
            }
            ?>

            </div>
         <?php } else {
            echo "<h2>Sorry, no posts were found!</h2>";
         }
         ?>

      </div><!-- End id=\'a-z\' -->
   </div><!-- End class=\'margin-top --> 
</div><!-- End id=\'rightcolumn\' -->


<?php
function end_prev_letter() {
   end_prev_row();
   echo "</div><!-- End of letter-group -->\\n";
   echo "<div class=\'clear\'></div>\\n";
}
function start_new_letter($letter) {
   echo "<div class=\'letter-group\'>\\n";
   echo "\\t<div class=\'letter-cell\'>$letter</div>\\n";
   start_new_row($letter);
}
function end_prev_row() {
   echo "\\t</div><!-- End row-cells -->\\n";
}
function start_new_row() {
   global $in_this_row;
   $in_this_row = 0;
   echo "\\t<div class=\'row-cells\'>\\n";
}

?>

SO网友:BVRoc

这是解决这个问题的基本方法。这会修改SQL查询本身,但它几乎是一个1行程序。我确信还有其他方法,但这种方法对查询构建过程没有太大的影响,因为它只在最后修改SQL。注意:我意识到这个方法可能会在某个时候被查询生成器的语法所篡夺。

首先钩入过滤器:

add_filter(\'posts_request\', \'YP_company_name_where\', 10, 2);
然后,让我们修改SQL请求的确切部分,请注意,我们正在查找正在运行的搜索/筛选是针对第一个字母的情况,在我们的特定情况下,如果$输入包含“short company name”。根据您的喜好调整您的条件。

function YP_company_name_where($input,  &$wp_query) {

    if (stripos($input, \'short-company-name\') !== FALSE) {

        $x = preg_replace("/wp_postmeta.meta_key\\s=\\s\'short-company-name\'\\sAND\\sCAST\\(wp_postmeta.meta_value\\sAS\\sCHAR\\)\\sLIKE\\s\'\\%/",
                          "wp_postmeta.meta_key = \'short-company-name\' AND CAST(wp_postmeta.meta_value AS CHAR) LIKE \'", $input, 1);
        return $x;
    }

    return $input;
}
请注意,如果这与您的特定查询不完全一样,只需转储$输入,找到错误的输入,并在此阶段调整SQL,以便您的查询根据您需要的列查找“…like[letter]%”。“replace”真正做的就是准确定位特定查询,删除“LIKE%[letter]%”,并将其替换为“LIKE[letter]%”。

我这样做是因为我已经使用了一个前端插件来过滤/查询帖子,无法轻松地使用独立的SQL查询来查找第一个字母。我正在处理一个多参数、用户驱动和/或逻辑过滤的查询情况,对于这一种情况,修改最终结果更容易。

结束

相关推荐

Get_Search_link()重定向到404模板页面

我构建了一个自定义主题,其中有一个404。php页面和搜索。php页面。在模板的其他地方,我想直接链接到搜索页面。因此,我使用get\\u search\\u template()函数来获取搜索页面链接,其结果如下:http://example.org/search当我单击链接时,我会被发送到404页面模板。为什么会转到404页面模板而不是搜索页面模板?