• Skip to main content
  • Skip to primary sidebar
  • Skip to footer
  • タイプ
    • 日記
    • 読書
    • 買物
    • ドラフト
    • 記事
    • まとめ
  • トピック
    • PCスマホ
    • 金融
    • 家事子育
    • 働き方
    • メンタル
    • ブログ
    • 未分類
    • 作業標準化
    • ドラム
    • 生活
    • リストアップ
    • その他

ストレスから自由になる日記

ストレスを発見し、自由になる方法をメモします。

現在の場所:ホーム / トピック / ブログ / Wordpressのカスタムフィールドをクイック編集できるようにした

WordPressのカスタムフィールドをクイック編集できるようにした

カスタムフィールドをクイック編集できるようにする

テーマ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/

The following two tabs change content below.
  • この記事を書いた人
  • 最新の記事
Twitter のプロフィール

フリーダム

うつ病の子育て中の金融系システムエンジニアです。 名もなき家事、目的のない仕事、見えない不自由、チリツモストレスを見つけ出して、設備投資、システム化、見える化により、解決します。 習い事で、ドラムをしていました。
Twitter のプロフィール

最新記事 by フリーダム (全て見る)

  • 池袋東口のスターバックス - 2025-08-23
  • iPhoneアプリ開発 - 2025-08-20
  • OpenAIのAPIキーを使って利用する方法 - 2025-08-20

共有:

  • クリックして X で共有 (新しいウィンドウで開きます) X
  • Facebook で共有するにはクリックしてください (新しいウィンドウで開きます) Facebook
  • クリックして Pocket でシェア (新しいウィンドウで開きます) Pocket

いいね:

いいね 読み込み中…

最初のサイドバー

Googleでサイト内検索

固定ページ

  • このサイトについて
  • ストレスから自由になる日記のホームページ
  • ストレスから自由になる日記の投稿ページ
  • 新着投稿一覧

最近のコメント

  • パスワード入力が必要な認証付きプロキシの内側のLANでmattermostクライアントとVisua lStudioCodeを使う に iloveadachi より
  • パスワード入力が必要な認証付きプロキシの内側のLANでmattermostクライアントとVisua lStudioCodeを使う に kaakaa より
  • 泣かせっぱなしにするクライングコントロールで、九ヶ月の子供が、三日間で朝の六時まど寝た。 に クライングコントロールのその後 夜中にまた起きるようになった。 – 金融系なんちゃってSEの日記 より

最近の投稿

  • 池袋東口のスターバックス
  • iPhoneアプリ開発
  • OpenAIのAPIキーを使って利用する方法
  • キーマカレーをほぼ何もしないで10分で作る
  • 子供用料理を食べ続けるのが辛いので、並行して麻婆豆腐をほぼ何もしないで10分で作る

感想、要望などコメントをください

Footer

Feedly でフォロー

follow us in feedly

はてなブックマーク でフォロー

このエントリーをはてなブックマークに追加

トップページへのリンク

ストレスから自由になる日記 トップページ

%d