wordpress投稿一覧とクイック編集にカスタムフィールドを追加

よく忘れるのでまとめ。
以下の方法で,カスタムフィールドを投稿の一覧およびクイック編集へ追加できる。

(テンプレートディレクトリ)/function.php

/**
 * 一覧画面にカスタムフィールドを登録する
 */
function regist_list_posttype_customfields($defaults) {
	
	// キー:カスタムフィールドキー, 値:和名
	$defaults['link'] = 'リンクURL';
	$defaults['popup'] = 'リンク後のウィンドウ';
	
	// JSのロード
    wp_enqueue_script(
        'edit_quick',	// ハンドル
        get_bloginfo('template_url')
        	.'/list_posttype_customfields.js',	// JSファイル
        array('jquery'),	// 先にロードされるべきハンドル
        filemtime(dirname( __FILE__ ).'/list_posttype_customfields.js'),	// バージョン
        // (※数字を指定してもよいが更新日時を取得すると楽)
        false	// true: 直前, false: 内
    );
    
	return $defaults;
}
add_filter('manage_posts_columns', 'regist_list_posttype_customfields');
/**
 * 一覧画面にカスタムフィールドを表示する(登録していないと有効にならない)
 */
function add_list_posttype_customfields($field_key, $post_id) {
	
    switch ($field_key) {
    case 'link':
	    $value = get_post_meta(
	        $post_id,   // 投稿ID
	        'link', // カスタムフィールドキー
	        true    // true:単一文字列, false:複数配列
	    );
	    echo ''.@$value.'';
        break;
    case 'popup':
		$value = get_post_meta(
		    $post_id,   // 投稿ID
		    'popup',    // カスタムフィールドキー
		    true    // true:単一文字列, false:複数配列
		);
	    if ($value === '1') {
	        echo   '別窓表示';
	    } else {
	        echo   '';
	    }
        break;
    default:
    }
}
add_action('manage_posts_custom_column', 'add_list_posttype_customfields', 10, 2); // 第3引数:優先度, 第4引数:パラメータ数
/**
 * 投稿のクイック編集にカスタムフィールド追加(登録していないと有効にならない)
 */
function add_quick_posttype_customfields($field_key) {
	
	// 一度だけ表示
	static $print_nonce = true;
    if ($print_nonce) {
        $print_nonce = false;
        
		// CSRF対策
        wp_nonce_field(wp_create_nonce(__FILE__), 'custom_fields_nonce');
        
        // クイック編集
        echo '';
    }
    
	// HTML生成
    switch ($field_key) {
    case 'link':
	    echo '
'; echo '
'; echo 'リンクURL'; echo ''; echo '
'; echo '
'; break; case 'popup': echo '
'; echo '
'; echo 'リンク後のウィンドウ'; echo ''; echo ''; echo '
'; echo '
'; break; default: } } add_action('quick_edit_custom_box', 'add_quick_posttype_customfields');

(テンプレートディレクトリ)/list_posttype_customfields.js

(function($) {
	
	var inline_edit_post_edit = inlineEditPost.edit;
	inlineEditPost.edit = function (id) {
		inline_edit_post_edit.apply(this, arguments);
		
		// 投稿ID取得
		var post_id = 0;
		if (typeof(id) === 'object') {
			post_id = parseInt(this.getId(id));
		}
		if ( post_id > 0 ) {
			var $edit_row = $('#edit-'+post_id);
			var $post_row = $('#post-'+post_id);

			// リンクURL
			var value = $('.column-link span', $post_row).html();
			$('input[name="link"]', $edit_row).val(value);

			// リンク後のウィンドウ
			var value = $('.column-popup span', $post_row).html();
			$('input[name="popup"][type="checkbox"]', $edit_row).prop('checked', value ? true : false);

		}
	};
 
})(jQuery);