Personal WP Customization Notes (PWCN)

WordPressで実際に行ったカスタマイズの記録、発生した問題への対処時のメモ、ブロックテーマのカスタマイズなど

投稿一覧でクイック編集の更新後に値がずれて表示されるケースと対処方法

「manage_posts_columns」で投稿一覧へ何かを表示する列(カラム)を追加した時、通常はプログラム順に右へ右へと追加されます(ちなみに、固定ページの場合は「manage_pagess_columns」)。

これを任意の場所へ表示させたいと考えた場合、わざわざプログラム順を変えるのも大変だし、他のプラグインが追加した列も考慮すると完全には制御できないので、多くのページで紹介されているforeachで回して位置を指定する方法を取り入れている方は多いと思います。

でもこの方法、私が試した限りではちょっと難点があって、クイック編集を開いて更新すると、値が表示される列がずれるという現象が発生するんです。

下図は、「最終更新日」という列を追加して、foreachを使って「日付」の左に表示させた状態で、クイック編集を行った際の状況です(上の画像がクイック編集前、下がクイック編集更新後です)。

よく見てみると、クイック編集前に表示されていた「最終更新日」列の値(2024年1月2日)が、クイック編集の更新後に戻った一覧では値が取得されず、しかも本来「日付」に表示されるべき値が「最終更新日」列に表示される(右に複数の列がある場合は全部が左に1列ずれる)ようになってしまっています。

一覧をリロードすると直るので、個人で使用するのであれば問題ないのですが、誰かが触るサイトだったり、配布している機能だったりすると、不具合に見えてしまい、あまり良い方法ではないように思います。

そこで、いろいろと試行錯誤&最大限の検索能力を発揮させて(笑)解消した方法を紹介します。

なお、一口に管理画面の一覧に列を追加といってもいろいろな書き方があるので、後述するコード例を参考にされる方は、自身のコードとの相違点などをいろいろと精査した上で活用ください。

クイック編集から戻った一覧の値ズレを起こさないようにする方法

まず...肝心の不具合が発生したforeachで回すコードは、対処中に消してしまったため、ここでは例を掲載できませんのであしからず(多分いろいろなページのコードのほとんどはどこかのコードのコピーっぽいので「WordPress 管理画面 列 位置」などで調べればコードにはたどり着けるでしょう..)。

さて、以下が管理画面の投稿一覧へ列を追加する際の基本コードです(このコードは列の追加のみで、値の指定を行う別のユーザー定義関数+「manage_posts_custom_column」フックを使用するコードは本ページでは関係がないので割愛します)。

function pwcn_add_modified_column( $columns ) {
    $columns['Modified'] = __( 'Last Modified Date' );

    return $columns;
}
add_filter( 'manage_posts_columns', 'pwcn_add_modified_column' );

まあ「Modified」という列名で「Last Modified Date」という文字列で見出し表示という意味ですね(言うまでもないか..)。

今回のケースでは「Modified」という列を日付である「date」列の右へ表示させるために行っていたforeach回しで不具合が出たわけです。

そこで入れ替えて不具合が解消したのが以下のコードです。

function pwcn_add_modified_column( $columns ) {
    $modified_column = array( 'Modified' => __( 'Last Modified Date' ) );

    // カラムの順序を変更するために、dateカラムのインデックスを取得
    $date_column_index = array_search( 'date', array_keys( $columns ) );

    // dateカラムの右側にModifiedカラムを追加
		//1行目 日付カラムの右で一旦分割
		//2行目 更新日カラムを追加
		//3行目 日付カラムの右(更新日)のさらに右には何もない状態に戻す
		$columns = array_slice( $columns, 0, $date_column_index + 1, true )
			+ $modified_column
			+ array_slice( $columns, $date_column_index + 1, null, true );

    return $columns;
}
add_filter( 'manage_posts_columns', 'pwcn_add_modified_column' );

コード内にコメントをいっぱい入れていますが、要は投稿一覧の「日付」列の右側へ「更新日」列を入れ込み、残りの列をその右へ表示させるという手法です。

私の場合には、他のコード(値の出力を行うコードやクイック編集のコードなど)は一切触らずこの方法で解消できましたので、試してみる価値はあるかも知れません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

※リンクやURLの挿入されているコメントは無視します

WordPressのトラブル対処方法
画面上部に「PHP Notice: ob_end_flush(): Failed to send buffer of zlib output compression (0) in…」という表示が出る原因と対処