問題描述
我試圖找到一種通過媒體項目分配的帖子類別來過濾媒體庫的方法。我可以看到你可以通過”attached to” 進行排序,但這隻會讓我有一些方法。有什麼建議麼?
最佳解決方案
您可以使用 pre_get_posts 過濾查詢。
所以你可以
-
從查詢 vars 中檢索一個類別
-
用該類別檢索帖子
-
將媒體查詢設置為僅包含具有該帖子的帖子作為父項
要給出一個 UI,您可以使用 restrict_manage_posts 鈎子輸出類別下拉列表。
add_action('pre_get_posts', 'my_filter_media_by_cat');
add_action( 'restrict_manage_posts', 'my_add_media_cat_dropdown' );
function my_filter_media_by_cat( $q ) {
$scr = get_current_screen();
$cat = filter_input(INPUT_GET, 'postcat', FILTER_SANITIZE_STRING );
if ( ! $q->is_main_query() || ! is_admin() || (int)$cat <= 0 || $scr->base !== 'upload' )
return;
// get the posts
$posts = get_posts( 'nopaging=1&category=' . $cat );
// get post ids
$pids = ( ! empty( $posts ) ) ? wp_list_pluck($posts, 'ID') : false;
if ( ! empty($pids) ) {
$pidstxt = implode($pids, ',');
global $wpdb;
// get the ids of media having retrieved posts as parent
$mids = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_parent IN ($pidstxt)");
if ( ! empty($mids) ) {
// force media query to retrieve only media having retrieved posts as parent
$q->set( 'post__in', $mids );
} else {
// force media query to return no posts
$q->set( 'p', -1 ); // let query found nothing
}
}
}
function my_add_media_cat_dropdown() {
$scr = get_current_screen();
if ( $scr->base !== 'upload' ) return;
$cat = filter_input(INPUT_GET, 'postcat', FILTER_SANITIZE_STRING );
$selected = (int)$cat > 0 ? $cat : '-1';
$args = array(
'show_option_none' => 'All Post Categories',
'name' => 'postcat',
'selected' => $selected
);
wp_dropdown_categories( $args );
}
這個代碼的負面因素是你必須使用 3 個查詢過濾媒體…
UI 結果:
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。
