web-dev-qa-db-ja.com

メディアライブラリ - 画像をカスタム投稿タイプに制限する

特定のカスタム投稿タイプにアップロードされた画像だけをメディアライブラリに表示させるWordpressの魔法/プラグインはありますか? 「アーティスト」と呼ばれるカスタム投稿タイプがあります。管理者がクリックして画像をアップロード/添付すると、メディアライブラリのポップアップにはアーティストのカスタムタイプにアップロードされた画像のみが表示されます。

私は、カスタムフィールドとカスタム投稿タイプのUIを処理するためにACFプラグインを使います。これは可能ですか?

10
BillyMedia

私はあなたの問題が正しいかどうか100%確信していません、しかし...多分これはあなたを助けるでしょう...

メディアアップローダは単純なWP_Queryで添付ファイルを取得するので、その内容を変更するために多くのフィルタを使うことができます。

唯一の問題は、WP_Query引数を使用して、特定のCPTを持つ投稿を親としてクエリできないことです。したがって、posts_whereおよびposts_joinフィルタを使用する必要があります。

メディアアップローダのクエリのみを変更するようにするため、ajax_query_attachments_argsを使用します。

そして、これが組み合わされたときの外観です。

function my_posts_where($where) {
    global $wpdb;

    $post_id = false;
    if ( isset($_POST['post_id']) ) {
        $post_id = $_POST['post_id'];

        $post = get_post($post_id);
        if ( $post ) {
            $where .= $wpdb->prepare(" AND my_post_parent.post_type = %s ", $post->post_type);
        }
    }

    return $where;
}

function my_posts_join($join) {
    global $wpdb;

    $join .= " LEFT JOIN {$wpdb->posts} as my_post_parent ON ({$wpdb->posts}.post_parent = my_post_parent.ID) ";

    return $join;
}


function my_bind_media_uploader_special_filters($query) {
    add_filter('posts_where', 'my_posts_where');
    add_filter('posts_join', 'my_posts_join');

    return $query;
}
add_filter('ajax_query_attachments_args', 'my_bind_media_uploader_special_filters');

投稿の編集中(投稿/ページ/ CPT)にメディアアップローダーダイアログを開くと、この特定の投稿タイプに添付されている画像のみが表示されます。

特定の投稿タイプに対してのみ機能させたい場合(たとえばページ)、my_posts_where関数の条件を次のように変更する必要があります。

function my_posts_where($where) {
    global $wpdb;

    $post_id = false;
    if ( isset($_POST['post_id']) ) {
        $post_id = $_POST['post_id'];

        $post = get_post($post_id);
        if ( $post && 'page' == $post->post_type ) {  // you can change 'page' to any other post type
            $where .= $wpdb->prepare(" AND my_post_parent.post_type = %s ", $post->post_type);
        }
    }

    return $where;
}
9