通过自定义字段首字母过滤查询 - Wordpress

时间:2012-04-10 20:08:20

标签: wordpress indexing custom-fields

我正在处理目录员工列表。我去了一个自定义解决方案,因为用于此目的的插件太复杂或太简单,无法满足我的需求。 所以我创建了这个自定义帖子类型“staff”,附带了自定义分类法(科学,数学,管理等),所以我有一个查询,我在表格中列出了所有这些帖子,我的代码如下所示。 / p>

<table class="directorytable">
   <thead>
      <th class="first-th">Portrait</th>
      <th>Name</th>
      <th>Position</th>
      <th>Phone</th>
      <th style="width:60px !important;text-align:center;">Email&nbsp;&nbsp;&nbsp;&nbsp;</th>
      <th style="width:60px !important;text-align:center;">Website&nbsp;&nbsp;</th>
      <th style="width:60px !important;text-align:center;">Details&nbsp;&nbsp;</th>  
   </thead>
<?php query_posts(array('post_type'=>'staff','orderby'=>'meta_value','meta_key'=>'staff_last_name','order'=>'asc'))?>
<?php while(have_posts()): the_post();?>

<tr>
    <td class="first-td"><a rel="lightbox" href="<?php the_permalink(); ?>"/><img src="<?php the_field('staff_portrait');?>" style="border-radius:2px; width:35px;"/></a></td>
<td><a rel="lightbox[1]" href="<?php the_permalink();?>"><?php the_field('staff_name');?> <?php the_field('staff_last_name');?></a> </td>
<td><?php the_field('staff_position'); ?></td>
<td><?php the_field('staff_phone');?> | <strong>Ext: </strong><?php the_field('staff_extension')?></td>
<td style="width:60px; text-align:center;"><a href="mailto:<?php the_field('staff_email');?>"><img src="/images/directory/mail.png"/></a></td>
<td style="width:60px; text-align:center;"><?php if(get_post_meta($post->ID,'staff_website', true)){?><a target="_blank" href="<?php the_field('staff_website');?>"><img src="/images/directory/document-globe.png"/></a><?php } else {?><?php echo '';?><?php } ?></td>
<td style="width:60px; text-align:center;"><a rel="lightbox[2]" href="<?php the_permalink();?>"><img src="/images/directory/magnifier-zoom.png"/></a></td>
</tr>   
<?php endwhile; ?>
</table>

所以这个列表运行得非常好,但我的客户端要求我添加一个字母索引。所以我需要在结果之前列出一个范围a-z,然后点击,只显示他们的“staff_last_name”自定义字段(我使用ACF)以所选字母开头的帖子。

我尝试过一些像AZIndex,WP-Snap等插件,但这些插件都不适用于我。

我对此事的任何建议/解决方案表示感谢。

1 个答案:

答案 0 :(得分:1)

我假设您有初始搜索(即您正在生成链接,然后检索传递的值,例如通过$_GET或添加query_var,如$initial 3}})。

我还假设你已经检查过它有一个有效值(例如是一个单字母字符)。

假设该值存储在名为<?php query_posts ( array( 'post_type'=> 'staff', 'orderby' => 'meta_value', 'meta_key' => 'staff_last_name', 'order' => 'asc', 'meta_query' => array( array( 'key' => 'staff_last_name', 'value' => $initial, 'compare' => 'LIKE' ) ) ) ); ?> 的变量中,请将查询更改为

$initial

将生成您需要的大部分内容(有关详细信息,请参阅this example),但不幸的是,它会在姓氏中的任何位置找到$initial。如果查询区分大小写,并且只有第一个字符(和get_meta_sql)是大写的,则可能无关紧要。

如果它不能按你的需要工作,我可以考虑三个选项:

  1. 使用“BETWEEN”而不是“LIKE”,并传递您要搜索的字母的值和后面的字母值(以ASCII值递增),例如如果您要搜索以'A'开头的名字,请传递'A,B',
  2. 使用上面的查询添加posts_where过滤器,并将参数中的“'%”替换为“'”。如果您的查询中有任何其他LIKE条件,或
  3. ,则可能会产生意外的副作用
  4. 添加{{1}}过滤器以自行添加所需的SQL。