これは、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 クエリを理解すれば、理解できるはずです。あなたはそのように学ばないので、私はあなたに答えを与えたくありません. そこで、代わりに次のことを行います。それを達成するために必要な手順を説明し、理解してもらいます。質問がある場合や行き詰まった場合は、コメントを投稿してください。私がお手伝いします。
ディレクターの姓をGET
パラメーターとして受け取る別のカスタム ページ テンプレートを作成する必要があります。これは、取締役の姓の最初の文字を表示するために使用したものとまったく同じです。
次に、wp_postmeta
テーブルにクエリを実行し、取締役の姓に等しいものpost_id
WHERE
を選択する必要があります。meta_value
投稿 ID をループして、投稿のタイトルを表示する必要があります。
注:便利な関数はget_the_title()
. 投稿の ID を渡すと、タイトルが返されます。
これまでに示したすべてを使用して、質問に答えることができます。しかし、前にも言ったように、わからない問題が発生した場合はお知らせください。
また、この機能を完了したら、元の質問にコードを追加してください。その効率を大幅に改善できる可能性は十分にあります:)
PS 提供したコードの一部が理解できない場合は、お知らせください。理解できないコードを持っていても何の役にも立ちません:)
アップデート #3
最初からすべての手順を説明するビデオを作成しました。ディレクターの姓を引き出すことから始まり、すべての文字を表示し、最後にディレクターとのすべての WordPress 投稿を表示します。