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 の記事一覧で他ユーザーの投稿を非表示にする

http://ja.forums.wordpress.org/topic/15002 への回答例として

他ユーザーの投稿を編集する権限がない場合に、一覧表示から他ユーザーの記事を除外してしまう方法

function exclude_other_posts( $wp_query ) {
	if ( isset( $_REQUEST['post_type'] ) && post_type_exists( $_REQUEST['post_type'] ) ) {
		$post_type = get_post_type_object( $_REQUEST['post_type'] );
		$cap_type = $post_type->cap->edit_other_posts;
	} else {
		$cap_type = 'edit_others_posts';
	}

	if ( is_admin() && $wp_query->is_main_query() && ! $wp_query->get( 'author' ) && ! current_user_can( $cap_type ) ) {
		$user = wp_get_current_user();
		$wp_query->set( 'author', $user->ID );
	}
}
add_action( 'pre_get_posts', 'exclude_other_posts' );
所有 (1) | すべて (7) | 公開済み (4) | 下書き (3)

の数字が合わなくなってしまうのが気になる方は、CSSで .count に display: none; があたるようにしてください。