如何按字母顺序在Wordpress中显示自定义字段?

时间:2012-10-30 23:38:47

标签: wordpress custom-fields alphabetical

我需要在WP页面上显示一个自定义字段,该字段仅包含以字母A开头的值,没有重复项。目前,我使用的是Soju先前提供的代码。这按字母顺序排序,但我不能让它只显示以一个字母开头的值:

    <?php
    $movie_reviews = get_posts( 
    'numberposts=-1&order=ASC&orderby=meta_value&meta_key=LAST%20NAME' );
    $directors = array();
    foreach( $movie_reviews as $post ) {
        $director = get_post_meta( $post->ID, 'LAST NAME', true );
    }
    $directors = array_unique($directors);
    foreach( $movie_reviews as $post ) : setup_postdata( $post );
    foreach ($directors as $director) {
    }
    if (strtolower($director[0])=='') {
        // display what you want
    }
    ?>
    <span><li>
    <?php $director = get_post_meta( $post->ID, "LAST NAME", $single = true );
    if( $director !== '' ) {
    echo $director;
    } ?></br></li>
    </span>
    <?php endforeach; ?>

1 个答案:

答案 0 :(得分:0)

我认为你最好不要在数据库查询中处理它,而不是用PHP。使用当前代码,您将进行数十次低效的数据库调用。

拉取记录

WordPress将所有自定义字段存储在wp_postmeta表中,并可按如下方式检索。

mysql> SELECT post_id, meta_value FROM wp_postmeta WHERE meta_key = 'LAST NAME';
+---------+-------------------+
| post_id | meta_value        |
+---------+-------------------+
|       4 | Spielberg         |
|       6 | AveryTiredman     | <-- in the list twice
|       8 | bLanguage         |
|      10 | aWakeMahn         |
|      12 | dScreensAreBrukin |
|      14 | Aluloby           |
|      16 | AaLetterC         |
|      19 | AveryTiredman     | <-- 
+---------+-------------------+
8 rows in set (0.00 sec)

我使用自定义字段LAST NAME创建了多个帖子来复制您的网站。如您所见,上面的查询将我输入的所有姓氏作为自定义字段。

您可以使用以下内容对结果进行过滤和排序。

mysql> SELECT meta_value AS last_name FROM wp_postmeta
       WHERE meta_key = 'LAST NAME' and meta_value LIKE 'a%'
       GROUP BY meta_value
       ORDER BY meta_value;
+---------------+
| last_name     |
+---------------+
| AaLetterC     |
| Aluloby       |
| AveryTiredman | <-- only shown once
| aWakeMahn     |
+---------------+
4 rows in set (0.00 sec)

正如您所看到的,上述查询仅提取以字母"a"开头的唯一记录,并按名称对其进行排序。

注意:我将列名更改为与SELECT meta_value AS last_name更相关。

使用WordPress

WordPress有自己的数据库类,其方法名为get_results(),让您运行自己的查询。该方法将返回一个对象数组,使您可以访问列名。

<?php $directors = $wpdb->get_results("SELECT meta_value AS last_name FROM wp_postmeta WHERE meta_key = 'LAST NAME' and meta_value LIKE 'a%' GROUP BY meta_value ORDER BY meta_value") ?>
<ol>
  <?php foreach( $directors as $director ) : ?>
    <li><?php echo $director->last_name ?></li>
  <?php endforeach ?>
</ol>

我知道你是新手,我试图将它列出来,这样你就能明白发生了什么。如果您有任何问题,请告诉我,我会尽力帮助您。


更新

制作包含过滤导向器链接的页面的最简单方法是使用自定义页面模板。基本上,使用以下内容创建名为page-directors.php的文件。然后添加新页面并将模板设置为"Directors Page"

<?php
/**
 * Template Name: Directors Page
 */

// get a distinct set of the first letters available
$letters = $wpdb->get_results("SELECT DISTINCT substring(meta_value, 1, 1) as letters FROM wp_postmeta WHERE meta_key = 'LAST NAME' ORDER BY meta_value", ARRAY_N); 

// get the letter from the URL
// and make sure there is only a single letter
$director_letter = filter_input(INPUT_GET, 'director', FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^[a-z]$/i')));

// set a default if none is available
if( $director_letter == false ) {
  $director_letter = 'a';
}else {
  $director_letter = strtolower($director_letter);
}

// don't trust user's input
$director_letter = mysql_real_escape_string($director_letter);

// same query as before but includes letter from user
$directors = $wpdb->get_results("SELECT meta_value AS last_name FROM wp_postmeta WHERE meta_key = 'LAST NAME' and meta_value LIKE '$director_letter%' GROUP BY meta_value ORDER BY meta_value");

get_header();
?>
<div id="primary">
    <div id="content" role="main">
        <?php while ( have_posts() ) : the_post(); ?>

      <!-- 
        CSS:
        #director_letters li {
          list-style: none;
          display: inline;
        }
      -->
      <ol id="director_letters">
        <?php foreach( $letters AS $letter ) : ?>
          <li><a href="<?php echo add_query_arg('director', strtolower($letter[0])) ?>"><?php echo strtoupper($letter[0]) ?></a></li>
        <?php endforeach ?>
      </ol>

      <h2>Directors</h2>

      <ol>
        <?php foreach( $directors AS $director ) : ?>
          <li><?php echo $director->last_name ?></li>
        <?php endforeach ?>
      </ol>

        <?php endwhile; // end of the loop. ?>
    </div>
</div>
<?php get_footer() ?>

更新#2

如果您已经为我编写了代码和SQL查询,那么您应该能够理解它。我不想只是给你答案,因为你不会那样学习。所以这就是我要做的事情。我将为您提供完成它所需要的步骤并让您弄明白。如果您有任何问题或者您遇到问题,请发表评论,我会帮助您。

  1. 您需要创建另一个自定义页面模板,将导演的姓氏作为GET参数。它与我用来显示董事姓氏的第一个字母的内容完全相同。

  2. 接下来,您需要查询wp_postmeta表并选择post_id WHERE meta_value等于导演的姓氏。

    < / LI>
  3. 您需要循环帖子ID并显示帖子的标题。

  4.   

    注意:您会找到一个方便的功能get_the_title()。您可以传递帖子的ID,它将返回标题。

    到目前为止,我向您展示的所有内容都可以用来回答您的问题。但是,正如我之前所说,如果遇到一个你无法弄清楚的问题,请告诉我。

    此外,一旦您完成此功能,请将代码添加回原始问题。我们很有可能大大提高它的效率:)

    P.S。如果您不理解我提供给您的一些代码,请告诉我。拥有您不理解的代码对您没有任何好处:)

    更新#3

    我从一开始就制作了video explaining all the steps。首先是取出导演的姓氏,然后显示所有字母,最后向导演显示所有WordPress帖子。