カスタムフィールドをクイック編集できるようにする
テーマCocoonを利用しているが、カスタムフィールドを追加する必要があった。
カスタムフィールド自体は追加は簡単で投稿画面からカスタムフィールドを追加できる。
カスタムフィールドは投稿1つずつ登録が必要で、過去の投稿を1つずつ更新するのは大変。
投稿一覧のクイック編集で簡単に更新できたらいいのに、と思った。
ネットで調べて、子テーマのfunctions.phpに追記した。
追加した内容は以下で、カスタムフィールドをクイック編集できるようにする。
追加したカスタムフィールドは部、章、節、項番、ASIN
以下の2つのサイトのソースをコピーして、カスタムフィールドを簡単に追加できるようにソースを改良しました。
参考にしたサイト
https://webmanab-html.com/tip/quick-edit-custom-field/
http://www.wp-tech.net/wordpress_tips/2122/
phpよくわかっていないのに改良した
すべてのfunctionでglobal $mycfs;を記載しているがダサいですが、
$mycfs=[‘部’,’章’,’節’,’項番’,’ASIN’]; にカンマで区切ってカスタムフィールドを書けばいいようにしたのが、改良点です。
phpの知識とjQueryの知識が必要ですが、
phpの配列、配列に対するforeach、ヒアドキュメント、ヒアドキュメント(NowDoc)だけを学んでソースコードを改良しました。
phpの落とし穴
- ヒアドキュメントを使うときには、ヒアドキュメントを閉じる識別記号にインデントを入れると動かない。
- ヒアドキュメントを使うときに$マークが中にあると、うまく動かない。「$」部分を「\$」とするとか、NowDocで文字列を一旦変数にいれて、文字列置換しても良かったとおもったが完成後に気づいたので、そのままにした。
- 関数の中に、関数の外の変数が使うには魔法の行
global $mycfs;とglobalを使うと外の変数使える(全部の関数に書いているのがダサい。どなたか綺麗な書き方あったらコメントください。)
function.phpに問題があると、管理画面にログインできなくなる
function.phpは間違えると、管理画面にログインできなくなるので、注意が必要です。
失敗した場合、wordpressアプリを使ってログインし、外観からテーマを別のテーマに変えると、管理画面にログインできるようになるので、再修正して、テーマを変える。
<?php //子テーマ用関数 //カスタムフィールドをクイック編集できるようにする $mycfs=['部','章','節','項番','ASIN']; //投稿一覧画面にカスタムフィールドの表示カラムを追加 function my_posts_columns( $defaults ) { global $mycfs; foreach ($mycfs as $value){ $defaults[$value]=$value; } return $defaults; } add_filter( 'manage_posts_columns', 'my_posts_columns' ); //カスタムフィールドが複数ある場合は3もしくは4行目の内容を適宜置き換えて追加すればOKです。 //カスタムフィールド表示欄に入力値を表示させる function my_posts_custom_column( $column, $post_id ) { global $mycfs; if (in_array($column, $mycfs)) { $post_meta = get_post_meta( $post_id, $column, true ); if ( $post_meta ) { echo $post_meta; } else { echo ''; //値が無い場合の表示 } } } add_action( 'manage_posts_custom_column' , 'my_posts_custom_column', 10, 2 ); //クイック編集にカスタムフィールド(年度)の入力欄を表示 function display_my_quickmenu( $column_name, $post_type ) { global $mycfs; static $print_nonce = TRUE; if ( $print_nonce ) { $print_nonce = FALSE; wp_nonce_field( 'quick_edit_action', $post_type . '_edit_nonce' ); //CSRF対策 } echo <<<'EOF' <fieldset class="inline-edit-col-right inline-custom-meta"> <div class="inline-edit-col column-<?php echo $column_name ?>"> <label class="inline-edit-group"></p> EOF ; if (in_array($column_name, $mycfs)) { echo <<< EOF <span class="title">$column_name</span><input name="$column_name" /> EOF ; } echo <<<'EOF' </label> </div> </fieldset> EOF ; } add_action( 'quick_edit_custom_box', 'display_my_quickmenu', 10, 2 ); // カスタムフィールドの入力エリアにjQueryで値をセットしておく function my_admin_edit_foot() { global $mycfs; global $post_type; $slug = 'post'; // 投稿タイプの指定をしたいとき変更 if ( $post_type == $slug ) { echo <<<'EOF' <script type="text/javascript"> (function($) { var $wp_inline_edit = inlineEditPost.edit; inlineEditPost.edit = function( id ) { $wp_inline_edit.apply( this, arguments ); 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 ); EOF ; foreach($mycfs as $key => $value){ echo <<< EOF var \$mycfs{$key} = \$( '.column-{$value}', \$post_row ).html(); \$( ':input[name="{$value}"]', \$edit_row ).val( \$mycfs{$key} ); EOF; } echo <<<'EOF' } }; })(jQuery); </script> EOF ; } } add_action('admin_print_footer_scripts', 'my_admin_edit_foot'); function save_custom_meta( $post_id ) { global $mycfs; $slug = 'post'; //カスタムフィールドの保存処理をしたい投稿タイプを指定 if ( !current_user_can( 'edit_post', $post_id ) ) { return; } $_POST += array("{$slug}_edit_nonce" => ''); if ( !wp_verify_nonce( $_POST["{$slug}_edit_nonce"], 'quick_edit_action' ) ) { return; } foreach($mycfs as $value){ if ( isset( $_REQUEST[$value] ) ) { update_post_meta( $post_id, $value, $_REQUEST[$value] ); } } } add_action( 'save_post', 'save_custom_meta' ); // 以下のページより引用し、コードを改良 // https://webmanab-html.com/tip/quick-edit-custom-field/ // http://www.wp-tech.net/wordpress_tips/2122/
改良中の途中経過
<?php
//カスタムフィールドをクイック編集できるようにする//$mycfs=array(‘部’=>’部’,’章’=>’章’,’節’=>’節’,’項番’=>’項番’,’ASIN’=>’ASIN’);
//$mycfs=array(‘$part’=>’部’,’$chapter’=>’章’,’$section’=>’節’,’$page’=>’項番’,’$ASIN’=>’ASIN’);
$mycfs=[‘部’,’章’,’節’,’項番’,’ASIN’];//投稿一覧画面にカスタムフィールドの表示カラムを追加
function my_posts_columns( $defaults ) {
global $mycfs;
/*
$defaults[‘部’] = ‘部’;
$defaults[‘章’] = ‘章’;
$defaults[‘節’] = ‘節’;
$defaults[‘項番’] = ‘項番’;
$defaults[‘ASIN’] = ‘ASIN’;
*/foreach ($mycfs as $value){
$defaults[$value]=$value;
}return $defaults;
}add_filter( ‘manage_posts_columns’, ‘my_posts_columns’ );
//カスタムフィールドが複数ある場合は3もしくは4行目の内容を適宜置き換えて追加すればOKです。
//カスタムフィールド表示欄に入力値を表示させる
function my_posts_custom_column( $column, $post_id ) {
global $mycfs;
if (in_array($column, $mycfs)) {$post_meta = get_post_meta( $post_id, $column, true );
if ( $post_meta ) {
echo $post_meta;
} else {
echo ”; //値が無い場合の表示
}
}
/*
switch( $column){
case ‘部’:
$post_meta = get_post_meta( $post_id, ‘部’, true );
if ( $post_meta ) {
echo $post_meta;
} else {
echo ”; //値が無い場合の表示
}
break;
case ‘章’:
$post_meta = get_post_meta( $post_id, ‘章’, true );
if ( $post_meta ) {
echo $post_meta;
} else {
echo ”; //値が無い場合の表示
}
break;
case ‘節’:
$post_meta = get_post_meta( $post_id, ‘節’, true );
if ( $post_meta ) {
echo $post_meta;
} else {
echo ”; //値が無い場合の表示
}
break;
case ‘項番’:
$post_meta = get_post_meta( $post_id, ‘項番’, true );
if ( $post_meta ) {
echo $post_meta;
} else {
echo ”; //値が無い場合の表示
}
break;
case ‘ASIN’:
$post_meta = get_post_meta( $post_id, ‘ASIN’, true );
if ( $post_meta ) {
echo $post_meta;
} else {
echo ”; //値が無い場合の表示
}
break;
}
*/
}
add_action( ‘manage_posts_custom_column’ , ‘my_posts_custom_column’, 10, 2 );//クイック編集にカスタムフィールド(年度)の入力欄を表示
function display_my_quickmenu( $column_name, $post_type ) {
global $mycfs;
static $print_nonce = TRUE;
if ( $print_nonce ) {
$print_nonce = FALSE;
wp_nonce_field( ‘quick_edit_action’, $post_type . ‘_edit_nonce’ ); //CSRF対策
}
?>
<fieldset class=”inline-edit-col-right inline-custom-meta”>
<div class=”inline-edit-col column-<?php echo $column_name ?>”>
<label class=”inline-edit-group”></p>
<?php
if (in_array($column_name, $mycfs)) {
echo <<< EOF
<span class=”title”>$column_name</span><input name=”$column_name” />
EOF
;
}
?>
</label>
</div>
</fieldset>
<?php
}
add_action( ‘quick_edit_custom_box’, ‘display_my_quickmenu’, 10, 2 );//
//
//// カスタムフィールドの入力エリアにjQueryで値をセットしておく
function my_admin_edit_foot() {
global $mycfs;
global $post_type;
$slug = ‘post’; // 投稿タイプの指定をしたいとき変更
if ( $post_type == $slug ) {
?>
<script type=”text/javascript”>
(function($) {
var $wp_inline_edit = inlineEditPost.edit;
inlineEditPost.edit = function( id ) {
$wp_inline_edit.apply( this, arguments );
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 );
<?php
$mycfs=array(‘部’,’章’,’節’,’項番’,’ASIN’);
//$mycfs=array(‘$part’=>’部’,’$chapter’=>’章’,’$section’=>’節’,’$page’=>’項番’,’$ASIN’=>’ASIN’);
foreach($mycfs as $key => $value){
echo <<< EOF
var \$mycfs{$key} = \$( ‘.column-{$value}’, \$post_row ).html();
\$( ‘:input[name=”{$value}”]’, \$edit_row ).val( \$mycfs{$key} );
EOF;
}
?>
//部
//var $part = $( ‘.column-部’, $post_row ).html();
//$( ‘:input[name=”部”]’, $edit_row ).val( $part );
//章
//var $chapter = $( ‘.column-章’, $post_row ).html();
//$( ‘:input[name=”章”]’, $edit_row ).val( $chapter );
//節
//var $section = $( ‘.column-節’, $post_row ).html();
//$( ‘:input[name=”節”]’, $edit_row ).val( $section );
//項番
//var $page = $( ‘.column-項番’, $post_row ).html();
//$( ‘:input[name=”項番”]’, $edit_row ).val( $page );
//ASIN
//var $ASIN = $( ‘.column-ASIN’, $post_row ).html();
//$( ‘:input[name=”ASIN”]’, $edit_row ).val( $ASIN );
}
};
})(jQuery);
</script>
<?php
}
}
add_action(‘admin_print_footer_scripts’, ‘my_admin_edit_foot’);function save_custom_meta( $post_id ) {
global $mycfs;
$slug = ‘post’; //カスタムフィールドの保存処理をしたい投稿タイプを指定
// if ( $slug !== get_post_type( $post_id ) ) {
// return;
// }
if ( !current_user_can( ‘edit_post’, $post_id ) ) {
return;
}
$_POST += array(“{$slug}_edit_nonce” => ”);
if ( !wp_verify_nonce( $_POST[“{$slug}_edit_nonce”], ‘quick_edit_action’ ) ) {
return;
}
foreach($mycfs as $value){
if ( isset( $_REQUEST[$value] ) ) {
update_post_meta( $post_id, $value, $_REQUEST[$value] );
}
}
/*
}
if ( isset( $_REQUEST[‘部’] ) ) {
update_post_meta( $post_id, ‘部’, $_REQUEST[‘部’] );
}
if ( isset( $_REQUEST[‘章’] ) ) {
update_post_meta( $post_id, ‘章’, $_REQUEST[‘章’] );
}
if ( isset( $_REQUEST[‘節’] ) ) {
update_post_meta( $post_id, ‘節’, $_REQUEST[‘節’] );
}
if ( isset( $_REQUEST[‘項番’] ) ) {
update_post_meta( $post_id, ‘項番’, $_REQUEST[‘項番’] );
}
if ( isset( $_REQUEST[‘ASIN’] ) ) {
update_post_meta( $post_id, ‘ASIN’, $_REQUEST[‘ASIN’] );
}
*/
}
add_action( ‘save_post’, ‘save_custom_meta’ );//以下の2つのサイトからコピーして、修正しました。
// https://webmanab-html.com/tip/quick-edit-custom-field/
// http://www.wp-tech.net/wordpress_tips/2122/
フリーダム
最新記事 by フリーダム (全て見る)
- 藤元健太郎著『ニューノーマル時代のビジネス革命』を読んだ。読み辛いが、網羅的に新しいサービスが書かれていた。 - 2020-12-21
- ケリー・マクゴニガル著『スタンフォード式人生を変える運動の科学』 - 2020-12-21
- やまぐちせいこ著『シンプル思考ですっきり身軽に暮らす』に夫婦の会話のコツを学んだ - 2020-12-17