wordpress WordPress自作テーマのfunction.phpに合ったら便利なコード 最終更新日: 2023年4月15日
WPも色々便利(場合によっては余計な)な機能を付けてくるが、今回は投稿で使う新エディターが「無理」「Tinymceが良い」という場合の追記コード。 //投稿の自動整形制御
add_action(
	'add_meta_boxes',
	function(){
		$screens = array('post', 'page');
		foreach($screens as $scrn){
			add_meta_box(
				'peralab-custombox-dont-autoformatting',
//編集画面セクションのHTML ID
'自動整形を無効化',
//メタボックスのタイトル
'PeralabDontAutoFormatting_CustomBoxCreate',
//入力フォーム作成で呼び出されるコールバック
$scrn,
//表示するページ
'side',
//メタボックス表示箇所(advanced, normal, side)
'default',
//表示優先度(high, core, default, low)
				null);
//コールバック時に渡す引数があれば指定
		}
	}
);
//	メタボックスを作成
function PeralabDontAutoFormatting_CustomBoxCreate($post){	//$postには現在の投稿記事データが入っています
//入力済みのデータを取得
$data_str = get_post_meta($post->ID, "dont_autoformat_radio", true);
	if($data_str != 'dont'){
		$data_str = 'format';
	}
//nonce作成
wp_nonce_field('action-noncekey-dontautoformat', 'noncename-dontautoformat');
?>
	<?php
}
//	カスタムボックス内のフィールド値更新処理
add_action(
	'save_post',
	function($post_id){
		//nonceを確認
		if(isset($_POST['noncename-dontautoformat']) == false
				|| wp_verify_nonce($_POST['noncename-dontautoformat'], 'action-noncekey-dontautoformat') == false) {
			return;	//nonceを認証できなかった
		}
		//自動保存ルーチンかどうかチェック。そうだった場合はフォームを送信しない(何もしない)
if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE){
			return;
		}
		//パーミッション確認
		if(isset($_POST['post_type'])){
			if($_POST['post_type'] == 'page'){
				if(!current_user_can('edit_page', $post_id)){
					return;	//固定ページを編集する権限がない
				}
			}
			else{
				if(!current_user_can('edit_post', $post_id)){
					return;	//記事を編集する権限がない
				}
			}
		}
//== 確認ここまで ==
		//予約投稿時は、データが有るにも関わらず$_POSTからデータ取得ができないので、
		//issetでデータ確認が出来るときのみ値の更新処理を行います。
		if(isset($_POST['name-metabox_autoformat_radio'])){
			update_post_meta($post_id, "dont_autoformat_radio", $_POST['name-metabox_autoformat_radio']);
		}
	}
);
// 自動整形無効の実処理
//記事表示時の整形無効
add_action(
	'wp_head',
	function(){
		if(get_post_meta(get_the_ID(), 'dont_autoformat_radio', true) == 'dont'){
			remove_filter('the_content', 'wpautop');
			remove_filter('the_excerpt', 'wpautop');
		}
	}
);
//ビジュアルエディタ(TinyMCE)の整形無効
add_filter(
	'tiny_mce_before_init',
	function($init_array){
		if(get_post_meta(get_the_ID(), 'dont_autoformat_radio', true) == 'dont'){
			global $allowedposttags;
			$init_array['valid_elements']          = '*[*]';
			$init_array['extended_valid_elements'] = '*[*]';
			$init_array['valid_children']          = '+a[' . implode( '|', array_keys( $allowedposttags ) ) . ']';
			$init_array['indent']                  = true;
			$init_array['wpautop']                 = true;
			$init_array['force_p_newlines']        = false;
		}
		return $init_array;
	}
); 「出力する文字列」のとこは適当にわかりやすいようにすればい善し。
