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 のコードが見えてへんで。

マルチサイトでサイト作成時に自動的に ktaisession テーブルが作られるようにする

マルチサイトだと ktaisession テーブルが作成されずに、フィーチャーフォンで管理画面にログインできない貴方に。

add_action( 'wpmu_new_blog', 'generate_ktaisession_table' );

function generate_ktaisession_table( $blog_id ) {
	global $Ktai_Style;
	
	$blog_id = (int)$blog_id;
	if ( ! is_object( $Ktai_Style ) ) { return; }
	if ( ! class_exists( 'KtaiStyle_Install' ) ) {
		$admin_dir = WP_PLUGIN_DIR . '/' . $Ktai_Style->get( 'plugin_dir' ) . '/' . KtaiStyle::ADMIN_DIR;
		require_once( $admin_dir . '/install.php' );
	}
	if ( switch_to_blog( $blog_id ) ) {
		KtaiStyle_Install::install();
		restore_current_blog();
	}
}

WordPress の疑似cronの実行時間を調整する

WordPress で定期的な処理を行うには、wp_schedule_event という関数を用いることで実現可能です。使い方は、リンク先を見ていただくとして、定期実行させる時間を調整する方法(といっても単なる引数の設定の仕方)を紹介しておきます。

プラグインの有効化した時間に関わらず、午前1時に定期処理させたい場合は、

wp_schedule_event( ceil( time() / 86400 ) * 86400 + ( 1 - get_option( 'gmt_offset' ) ) * 3600, 'daily', 'my_daily_event' );

こんな感じ。午前1時ではなくて、もっと遅い時間などに実行させたい場合は、get_option の前の1を、その時刻で設定すれば大丈夫なはずです。

ceil( time() / 86400 ) * 86400

で、世界標準時での翌日午前0時のタイムスタンプが取れるので(※ WordPress は、内部処理を世界標準時の変更しているため、time関数などの返値がGMTとなります。)、これに時差の差分と、午前1時に実行させるための1時間分を加味させるために

( 1 - get_option( 'gmt_offset' ) ) * 3600

を足しています。

WordPress のカスタムフィールドをプレビュー対象にする

カスタムフィールドを使って、使いやすくはしてみたものの、「プレビューに反映されないんですけど!?」と言われてお嘆きの貴方に。

function get_preview_id( $post_id ) {
	global $post;
	$preview_id = 0;
	if ( $post->ID == $post_id && is_preview() && $preview = wp_get_post_autosave( $post->ID ) ) {
		$preview_id = $preview->ID;
	}
	return $preview_id;
}


function get_preview_postmeta( $return, $post_id, $meta_key, $single ) {
	if ( $preview_id = get_preview_id( $post_id ) ) {
		if ( $post_id != $preview_id ) {
			$return = get_post_meta( $preview_id, $meta_key, $single );
		}
	}
	return $return;
}
add_filter( 'get_post_metadata', 'get_preview_postmeta', 10, 4 );


function save_preview_postmeta( $post_ID ) {
	global $wpdb;

	if ( wp_is_post_revision( $post_ID ) ) {
		$wpdb->query( "DELETE FROM $wpdb->postmeta WHERE post_id = $post_ID" );
		$post_metas = apply_filters( 'preview_post_meta_keys', array( 'meta' ) );
		foreach ( $post_metas as $post_meta ) {
			foreach ( $_POST[$post_meta] as $meta_id => $meta_arr ) {
				add_metadata( 'post', $post_ID, $meta_arr['key'], $meta_arr['value'] );
			}
		}
		do_action( 'save_preview_postmeta', $post_ID );
	}
}
add_action( 'wp_insert_post', 'save_preview_postmeta' );

デフォルトのUIに対応させただけのものなので、Custom Field TemplateEditor TemplatesAdvanced Custom Fields での入力値に対応させたい場合は、save_preview_postmeta フックで、それぞれのプラグインの送信形式に合わせて、add_metadata(add_post_meta だと、公開中のデータを上書きしちゃうので注意)を実行するようにしてください。

※ 画像表示に影響が出るため、コードを一部修正しました。(2013/1/8)

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' );