0

我正在处理目录人员列表。我选择了一个自定义解决方案,因为用于此目的的插件对于我正在寻找的东西来说太复杂或太简单了。所以我创建了这个自定义的帖子类型“员工”,并附有自定义分类法(科学、数学、管理等),所以我有一个查询,我在表格中列出了所有这些帖子,我的代码如下所示。

<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>

所以这个列表工作得很好,但我的客户要求我添加一个字母索引。因此,我需要在结果之前列出一个范围 az,然后单击时,仅显示其“staff_last_name”自定义字段(我正在使用 ACF)以所选字母开头的帖子。

我尝试过一些插件,如 AZIndex、WP-Snap 等,但没有一个对我有用。

对于此事,我将不胜感激任何建议/解决方案。

4

1 回答 1

1

我假设你有你正在搜索的初始值(即你正在生成链接 OK,然后检索传递的值,比如通过$_GET或添加 a query_var,如本例所示)。

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

假设该值存储在一个名为 的变量中$initial,将您的查询更改为类似

<?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'
                )
            )
        )
    );
?>

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

如果它不能按您的需要工作,我可以想到三个选项:

  1. 使用“BETWEEN”而不是“LIKE”,并传递您正在搜索的字母的值和后面的字母(按 ASCII 值递增)例如,如果您正在搜索以“A”开头的名称,则传递“A,B” ',
  2. 使用上面的查询添加一个get_meta_sql过滤器,并将参数中的“'%”替换为“'”。如果您的查询中有任何其他 LIKE 条件,这可能会产生意想不到的副作用,或者
  3. 添加posts_where过滤器以自行添加所需的 SQL。
于 2012-04-11T11:27:27.300 回答