WordPress 3.5 からの新アップローダーでもメディア表示をアップロードしたユーザーのみに限定する

以前投稿した、WordPress のメディア表示をアップロードしたユーザーのみに限定する では、3.5から導入された新アップローダーのメディア表示には対応できていませんでした。これは、新アップローダーが Ajax で動作しているため、先の記事で紹介した条件分岐の is_main_query に合致せず、ユーザーでの限定条件が付加されなかったのが原因です。

新アップローダーの画像取得は、wp-admin/includes/ajax-actions.phpwp_ajax_query_attachments で行われています。
画像の取得自体は、WP_Query を利用しているので、旧バージョンで用いた pre_get_posts でのフックも有効ではありますが、残念な事に、このままだとこの関数によるクエリーかどうかの判別条件が曖昧です。

そこで、この Ajax が動作するときのみ有効となる定数を設定して、それを pre_get_posts の条件に加えることにします。

WordPress の Ajax は、wp-admin/admin-ajax.php にリクエストされ、アクションフックを用いて、実行関数が呼ばれるようになっています。該当箇所のコードは、

CODE 1

add_action( 'wp_ajax_' . $_GET['action'], 'wp_ajax_' . str_replace( '-', '_', $_GET['action'] ), 1 );

となっており、画像取得の場合は、wp_ajax_query-attachments というフックが呼ばれます。Ajax の実行関数が呼ばれる優先度は、CODE 1 を見てわかるように 1 となっているので、定数の定義を行うには、これより優先度が高い(数字が少ない)優先度を設定して、早く行わなければなりません。

優先度 0 にて、DOING_QUERY_ATTACHMENT という定数を設定し、この定数の定義の有無により、ユーザーの条件を付加させるためには、

CODE 2

/*
 * メディアの抽出条件にログインユーザーの絞り込み条件を追加する
 */
function display_only_self_uploaded_medias( $wp_query ) {
	if ( is_admin() && ( $wp_query->is_main_query() || ( defined( 'DOING_QUERY_ATTACHMENT' ) && DOING_QUERY_ATTACHMENT ) ) && $wp_query->get( 'post_type' ) == 'attachment' ) {
		$user = wp_get_current_user();
		$wp_query->set( 'author', $user->ID );
	}
}
add_action( 'pre_get_posts', 'display_only_self_uploaded_medias' );


function define_doing_query_attachment_const() {
	if ( ! defined( 'DOING_QUERY_ATTACHMENT' ) ) {
		define( 'DOING_QUERY_ATTACHMENT', true );
	}
}
add_action( 'wp_ajax_query-attachments', 'define_doing_query_attachment_const', 0 );

と、いった感じになります。

「WordPress 3.5 からの新アップローダーでもメディア表示をアップロードしたユーザーのみに限定する」への2件のフィードバック

  1. こんにちは。以前のメディア表示限定方法に関する記事にコメントさせていただいた者です。
    新しいアップローダーにも対応した方法を記事にしていただき、とても助かりました。
    一つ前の記事の「他ユーザーの投稿を非表示にする」と合わせて自分のサイトでこの方法を使わせていただきました。

    限定する方法が分かるまで画像アップロード機能を止めていたので、これでようやく再開できます。
    ありがとうございました。

  2. 一年以上の遅レスで申し訳ありません。最近になってWordpressを触り始めてばかりの初心者なもので、探して探して、ようやくここにたどりつきました。
    確かにCODE 1 の前に入れたらuser毎に動いてくれました。
    もう少し進めて、複数ユーザーでWordPressへ投稿する場合、管理者権限以外の人には、自身の投稿やメディア以外を表示しないようにしたい(= 管理者だけは全て見える)としたいのですが、どのようにしたら良いかお教え願えないでしょうか?
    if ( !current_user_can( ‘level_5’ ) ) {
    global $current_user;
    {
    のような書き方?になるところまではわかったのですが、動いてくれませんでした。

    ご教授のほど、宜しくお願い申し上げます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です