おそらく答えが提供されていないことから想像できるように、解決策は決して簡単ではありません。私がやったことは、「movie
」のカスタム投稿タイプと「ジャンル」のカスタムフィールドキーを想定した、自己完結型の例を作成することです。
免責事項:これはWP3.0で動作しますが、以前のバージョンで動作するかどうかはわかりません。
基本的に、2つのフックをフックして動作させる必要があり、別の2つのフックを使用して明確かつ有用にする必要があります。
最初のフックは ' restrict_manage_posts
'で、これにより<select>
、「一括アクション」および「日付の表示」がフィルターされる投稿のリストの上の領域でHTMLを送信できます。提供されたコードは、次の画面スニペットに見られるように、「並べ替え:」機能を生成します。
(ソース:mikeschinkel.com)
投稿タイプのすべてのmeta_keysのリストを提供するWordPress API関数がないため、コードはダイレクトSQLを使用しています(将来のtracチケットのように聞こえます...)とにかく、ここにコードがあります。投稿タイプ$_GET
を取得して検証し、有効な投稿タイプpost_type_exists()
であると同時に投稿タイプであることを確認することに注意してくださいmovie
(2つのチェックはやり過ぎですが、ハードにしたくない場合の方法を示すために行いました。投稿タイプをコーディングします。)最後にsortby
、WordPressの他のものと競合しないため、URLパラメーターを使用します。
add_action('restrict_manage_posts','restrict_manage_movie_sort_by_genre');
function restrict_manage_movie_sort_by_genre() {
if (isset($_GET['post_type'])) {
$post_type = $_GET['post_type'];
if (post_type_exists($post_type) && $post_type=='movie') {
global $wpdb;
$sql=<<<SQL
SELECT pm.meta_key FROM {$wpdb->postmeta} pm
INNER JOIN {$wpdb->posts} p ON p.ID=pm.post_id
WHERE p.post_type='movie' AND pm.meta_key='Genre'
GROUP BY pm.meta_key
ORDER BY pm.meta_key
SQL;
$results = $wpdb->get_results($sql);
$html = array();
$html[] = "<select id=\"sortby\" name=\"sortby\">";
$html[] = "<option value=\"None\">No Sort</option>";
$this_sort = $_GET['sortby'];
foreach($results as $meta_key) {
$default = ($this_sort==$meta_key->meta_key ? ' selected="selected"' : '');
$value = esc_attr($meta_key->meta_key);
$html[] = "<option value=\"{$meta_key->meta_key}\"$default>{$value}</option>";
}
$html[] = "</select>";
echo "Sort by: " . implode("\n",$html);
}
}
}
2番目に必要な手順はparse_query
、WordPressが実行するクエリを決定した後、クエリを実行する前に呼び出されるフックを使用することです。ここで、のパラメータのCodexに記載されているクエリの配列の値orderby
とmeta_key
クエリのquery_var
配列に値を設定します。次のことを確認するためにテストします。orderby
query_posts()
- 私たちは管理者です(
is_admin()
)、
- 管理者(
$pagenow=='edit.php'
)の投稿をリストするページにあります。
- ページは、と
post_type
等しいURLパラメーターで呼び出されました。movie
- また、ページは
sortby
URLパラメーターを使用して呼び出され、' None 'の値が渡されなかった
これらすべてのテストに合格した場合、私たちはその後、設定query_vars
(文書化されているように、ここに)meta_value
と私たちsortby
「の値ジャンル」:
add_filter( 'parse_query', 'sort_movie_by_meta_value' );
function sort_movie_by_meta_value($query) {
global $pagenow;
if (is_admin() && $pagenow=='edit.php' &&
isset($_GET['post_type']) && $_GET['post_type']=='movie' &&
isset($_GET['sortby']) && $_GET['sortby'] !='None') {
$query->query_vars['orderby'] = 'meta_value';
$query->query_vars['meta_key'] = $_GET['sortby'];
}
}
そして、あなたがする必要があるのはそれだけです。「posts_order
」または「wp
」フックは不要です!もちろん、実際にはもっとする必要があります。投稿を一覧表示するいくつかの列をページに追加する必要があります。そうすると、並べ替えられている値を実際に表示できます。そうしないと、ユーザーは混乱します。manage_{$post_type}_posts_columns
この場合、フックを追加しmanage_movie_posts_columns
ます。このフックには、列のデフォルト配列が渡されます。簡単にするために、2つの標準列に置き換えました。チェックボックス(cb
)および投稿名(title
)。(デフォルトで利用可能な他のものを確認するためposts_columns
にaで検査print_r()
できます。)
URLパラメーターがある場合とない場合に、「並べ替え基準:」を追加することにしました。sortby
None
add_action('manage_movie_posts_columns', 'manage_movie_posts_columns');
function manage_movie_posts_columns($posts_columns) {
$posts_columns = array(
'cb' => $posts_columns['cb'],
'title' => 'Movie Name',
);
if (isset($_GET['sortby']) && $_GET['sortby'] !='None')
$posts_columns['meta_value'] = 'Sorted By';
return $posts_columns;
}
最後に、manage_pages_custom_column
フックを使用して、適切な投稿タイプの投稿があり、おそらく冗長なis_admin()
andのテストがある場合に、値を実際に表示します$pagenow=='edit.php'
。sortby
URLパラメーターがある場合、リストで表示することで並べ替えられているカスタムフィールド値を抽出します。外観は次のとおりです(これはテストデータなので、映画の分類に関するピーナッツギャラリーからのコメントはありません!:):
(ソース:mikeschinkel.com)
そして、ここにコードがあります:
add_action('manage_pages_custom_column', 'manage_movie_pages_custom_column',10,2);
function manage_movie_pages_custom_column($column_name,$post_id) {
global $pagenow;
$post = get_post($post_id);
if ($post->post_type=='movie' && is_admin() && $pagenow=='edit.php') {
switch ($column_name) {
case 'meta_value':
if (isset($_GET['sortby']) && $_GET['sortby'] !='None') {
echo get_post_meta($post_id,$_GET['sortby'],true);
}
break;
}
}
}
これは、aの最初の「ジャンル」movie
、つまり特定のキーに複数の値がある場合の最初のmeta_value のみを選択することに注意してください。しかし、それ以外の場合は、それがどのように機能するのかわかりません!
そして、このコードを置く場所に慣れていない人のために、あなたはそれをプラグインに置くことができfunctions.php
ます。
これがどのように役立つか。