WordPress カスタム投稿タイプの管理領域をカスタムフィールドで並べ替える方法
-
16-10-2019 - |
質問
カスタム投稿タイプの 1 つを編集するときに、すべてのエントリを公開日ではなくカスタム フィールドで一覧表示できるようにしたいと考えています (カスタム投稿タイプの場合、これはおそらく関係ありません)。カスタム投稿タイプに関するブログ投稿のコメントからヒントを得たところ、著者はそれが可能であり、列名をクリックしてカスタム並べ替えができるようにもしたと述べました。彼が言及したのは、 posts_orderby
私自身のコメントで指摘した機能ですが、今ではブログ投稿を見つけることができなくなりました。助言がありますか?私はそれを使用する1つの解決策を見ました
add_action('wp', 'check_page');
そしてその check_page
使用される関数 add_filter
クエリを変更しますが、それはテーマファイルでのみ機能し、管理領域では機能しないと確信しています。
解決
回答が提供されていないことからも想像できると思いますが、解決策は決して簡単なものではありません。私がやったことは、カスタム投稿タイプを想定したある程度自己完結型の例を作成することです。movie
" とカスタム フィールド キー "ジャンル".
免責事項:これは WP3.0 では動作しますが、それ以前のバージョンでも動作するかどうかはわかりません。
基本的に、それを機能させるには 2 つのフックをフックする必要があり、それをわかりやすく便利にするためにさらに 2 つのフックをフックする必要があります。
最初のフックは「restrict_manage_posts
' HTML を出力できるようになります <select>
投稿リストの上の領域に「一括操作" そして "ショーの日付"フィルター。提供されたコードは、「並べ替え:この画面スニペットに示されている機能:
(ソース: mikeschinkel.com)
投稿タイプのすべてのメタキーのリストを提供する WordPress API 関数がないため、このコードは直接 SQL を使用します (将来的にはそうなるようです) 追跡 私にチケットを...) とにかく、これがコードです。投稿タイプを取得することに注意してください $_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 が実行すべきクエリを決定した後、クエリを実行する前に呼び出されるフック。ここで、次の値を設定します。 orderby
そして meta_key
クエリの中で query_var
配列 コーデックスに文書化されている の中に orderby
のパラメータ query_posts()
. 。次のことを確認するためにテストを行います。
- 私たちは管理者です(
is_admin()
), - 管理者の投稿を一覧表示するページが表示されています (
$pagenow=='edit.php'
), - ページは次のように呼び出されています
post_type
URL パラメータに等しいmovie
, 、 そして - このページはまた、
sortby
URL パラメータと、値 ' が渡されなかったことなし'
これらのテストがすべて合格したら、次の設定を行います。 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
とともに print_r()
デフォルトで他に何が利用できるかを確認してください)。
」を追加することにしました。並べ替え順:「何かあったときのために」 sortby
URLパラメータとそうでない場合 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()
そして $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;
}
}
}
これは最初の " のみを取得することに注意してください。ジャンル" のために movie
, 、つまり特定のキーに複数の値がある場合の最初のmeta_value。しかし、繰り返しになりますが、そうでない場合はどうなるかわかりません。
このコードをどこに置くべきかわからない人のために、プラグインに置くことができます。初心者の場合は、プラグインに置くことができます。 functions.php
現在のテーマ内のファイル。
これがどれほど役立つか。
他のヒント
WordPress 3.1(ベータ版を使用している)の時点で、タイトルを介して列をソートできるようになりました。
次の投稿では、それらを実装する方法を詳しく説明しています。
これが簡単な解決策です:
/* --------Sortable Events on Dashboard - show start date, time, venue--------- */
/*-------------------------------------------------------------------------------
Custom Columns
-------------------------------------------------------------------------------*/
function my_*YOUR POST TYPE*_columns($columns)
{
$columns = array(
'cb' => '<input type="checkbox" />',
'title' => 'Title',
'your_custom_field' => 'Custom Field Name',
'date' => 'Date',
);
return $columns;
}
function my_custom_columns($column)
{
global $post;
if($column == 'your_custom_field')
{
if(get_post_meta($post->ID, 'your_custom_field', true);)
{
echo get_post_meta($post->ID, 'your_custom_field', true);
}
}
}
add_action("manage_posts_custom_column", "my_custom_columns");
add_filter("manage_edit-*YOUR POST TYPE*_columns", "my_events_columns");
/*-------------------------------------------------------------------------------
Sortable Columns
-------------------------------------------------------------------------------*/
function my_column_register_sortable( $columns )
{
$columns['your_custom_field'] = 'your_custom_field';
return $columns;
}
add_filter("manage_edit-*YOUR POST TYPE*_sortable_columns", "my_column_register_sortable" );
交換するだけです あなたの投稿タイプ と 'your_custom_field'