新規投稿の場合、wp_insert_post_data フィルタが実行される段階では、まだ投稿のIDが取れないので、メタデータを操作することができません。また、このとき、カスタムフィールドの保存には、add_metadata() や update_metadata() といったユーザ関数が使われないので、これらにフックすることもできません。
そこで、投稿がデータベースに書き込まれた直後に実行されるアクションフック save_post またはwp_insert_post を利用する方法を考えました。この時点では投稿 ID が使えて、メタデータもデータベースにいったん保存されているので、それを読出し、メタキー対応するデータがあるかどうかをチェックして、存在すれば、書き換えて再保存するという手続きです。ちょっと回りくどいかもしれませんが、他の方法は考えつきませんでした。
なお、カスタムフィールドの値は、配列ではなく、文字列であるという前提にしてあります。また、データが保存される度に毎回書き換えが実行されます。
add_action('save_post', 'convert_alphanumeric');
function convert_alphanumeric($post_ID, $post, $update) {
$key = 'カスタムフィールドキー';
if ($value = get_metadata('post', $post_ID, $key, true)) {
$value = mb_convert_kana( $value, 'aKV', 'UTF-8' );
update_metadata('post', $post_ID, $key, $value);
}
}
お世話になります。
kjmtsh様 ありがとうございます。
このスレッドを作成してから自分なりに色々と模索し
唯一実現できた方法がmb_convert_kana($value,”a”)のような方法でした。
ブラウザでアクセスすると表面的に半角表示させる事はできたのですが
データベースには全角で保存されているのが納得できていませんでしたが
お教え頂いた方法を実行しましたら完璧に思い通りの動作でした!
この度はお手数をお掛けしてお考え頂きありがとうございました。
お世話になります。
kjmtsh様にお教え頂いた方法をテスト環境でテストを行い、本番環境にて実行いたしました。
当初、既存の投稿に対しテストしていただけでしたので気付かなかったのですが
本番環境にて新規投稿を行おうとした所、管理画面上部にエラーが表示されました。
PHP Warning: Missing argument 2 for convert_alphanumeric() …省略.
PHP Warning: Missing argument 3 for convert_alphanumeric() …省略.
functions.phpの該当する行が以下です。
function convert_alphanumeric($post_ID, $post, $update) {
テスト環境には何も出なかったのですが、テスト環境のログを確認すると新規投稿時に同様のエラーが出ていました。
プラグインを全停止、テーマを未編集のtwentytwelveに変更してもエラーが発生しています。
調べてみましたら引数がどう…とのことらしいのですが、PHPからっきしの自分には何が駄目なのか理解できません。
お手数をお掛けしますがご教示下さい。よろしくお願い申し上げます。
おおっと、失礼。訂正です。直し方は二つあります。
add_action('save_post', 'convert_alphanumeric', 10, 3);
と、最後に二つの数字を追加すること。最初の数値は関数を実行するときの優先順位です。二つ目の数値は関数に渡す引数の数を表します。
あるいは、上の場所はそのままにして、実際の引数を一つにすること。
function convert_alphanumeric($post_ID) {
どちらかで OK です。$post_ID しか使わないので、後者が正しい使い方でしょうね。自分で試すときには、ちゃんと書いていたので、エラーが出ていませんでした。コピーしちゃえばよかったのですが… ご指摘ありがとうございました。
お世話になります。
kjmtsh様 ありがとうございます。
早く直したい一心でエラー内容から2つめと3つめの引数が駄目なのかと意味も分からないまま仮定して
$postと$updateを削除して以下のようにした所エラーが出なくなりました。
function convert_alphanumeric($post_ID) {
この状態で半角への変換動作も問題ないので正解だったのかと疑問に思っていたのですが
お返事頂きました内容を読ませて頂きましたら正解だったようで安心しました。
別解もありましたようでPHPからっきしの自分には到底辿り着けない答えです^_^;
この度は誠にありがとうございました。