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 でメディアのリンク先から添付ファイルのページの選択肢を消去する

WordPress 3.5 から、メディアアップローダーがガラッと変わって、3.4 までの画像を添付ファイルページにリンクさせない方法が使えなくなってしまっていますが、下記コードで(かなり強引ですが)消すことができます。

function media_script_buffer_start() {
	ob_start();
}
add_action( 'post-upload-ui', 'media_script_buffer_start' );

function media_script_buffer_get() {
	$scripts = ob_get_clean();
	$scripts = preg_replace( '#<option value="post">.*?</option>#s', '', $scripts );
	echo $scripts;
}
add_action( 'print_media_templates', 'media_script_buffer_get' );

具体的には、該当部分のスクリプトを出力している部分の一部をバッファリングして(表示を止めてPHPで文字列として扱えるようにしています)、該当部分のコードを削除しています。

1つ間違うと必要な箇所を消してしまう可能性があるなど、本当はあまり使うべき手法ではないと思っているのですが、WordPress そのものを書き換えるよりはいいので、まあ、参考程度にとどめておいてください。

3.4まではこちら → WordPressのメディアアップローダーの”添付ファイル投稿URL”ってボタンを消してハッピーになる方法。
※ 串本先生、GitHub のコードが見えてへんで。

WordPress のメディアをアーカイブ表示してみる

リライトルールを追加して、post_status の指定をすると、メディアもアーカイブ表示ができるんですよ。奥さん。
ただし、is_home が true になるので、そのままだと home.php か、index.php での表示になってしまうのですけどね。

function add_attachiment_archive_rule() {
	$add_rules = array(
		'top' => array(
			'attachment/page/[0-9]{1,}/?$' => 'index.php?post_type=attachment&paged=$matches[1]',
			'attachment/?$' => 'index.php?post_type=attachment'
		),
		'bottom' => array(
		)
	);
	foreach ( $add_rules as $position => $rules ) {
		foreach ( $rules as $rewrite => $rule ) {
			add_rewrite_rule( $rewrite, $rule, $position );
		}
	}
}
add_action( 'init', 'add_attachiment_archive_rule' );

function attachment_archve_post_status( $wp_query ) {
	if ( ! is_admin() && $wp_query->is_main_query() ) {
		if ( ! is_singular() && $wp_query->get( 'post_type' ) == 'attachment' ) {
			$wp_query->set( 'post_status', 'inherit' );
		}
	}
}
add_action( 'pre_get_posts', 'attachment_archve_post_status' );

WordPress のメディア表示をアップロードしたユーザーのみに限定する

WordPress で、サイトによっては、自分のアップロードした画像しか利用させたくない場合などもありますよね。
そんなときでも、ちょこっとカスタマイズするだけで、メディアライブラリで表示されるものを制限できることができてしまいます。

“WordPress のメディア表示をアップロードしたユーザーのみに限定する” の続きを読む

WordPressで追加した画像サイズを本文に挿入できるようにする

WordPressで生成される画像サイズを追加する方法については、画像アップロードで作成される画像の種類を追加するにてご紹介しましたが、これだけだと本文に画像を追加する際のサイズの選択肢に表示されません。

今回は、さらに一歩進めてサイズを追加するとともに、挿入するサイズとして選択できるようにしてみました。

“WordPressで追加した画像サイズを本文に挿入できるようにする” の続きを読む