質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

2940閲覧

wordpressの記事最終更新日を「特定のカスタムフィールドが更新されたときだけ」更新したい

kuroinekosuki

総合スコア7

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/10/09 16:31

編集2018/10/10 06:23

件名のとおり、wordpressの記事最終更新日を「特定のカスタムフィールドが更新されたときだけ」更新したいのですが、可能でしょうか?

具体的に言いますと

(1)bookというカスタム投稿があり、
本文+カスタムフィールドが入力できるようになっています。

(2)通常は更新ボタンを押した時点で最終更新日が変更されますが、
これをカスタムフィールドに変更があったときだけ、最終更新日が変更されるようにしたいのです。

(3)なお、カスタム投稿(book)以外の投稿は、通常の仕様のまま運用したいです。

もし実現可能なのであれば、ご教示いただけますと幸いです。
何卒よろしくお願いいたします。

**追記
お返事ありがとうございます。調べて「チェックを入れてから更新ボタンを押したときだけ最終更新日を更新する」という処理を公開してくださっている方のページを見つけて、そちらの処理を一度入れてみました。
これをチェックを入れたときではなく、カスタムフィールドが書き換えられたときという条件に変更すればよいのかと思ったのですが、「カスタムフィールドが書き換えられたとき」をどのように判別すればよいのかというところで止まってしまいました。

**追記2
説明が不足しておりまして大変申し訳無いです。カスタム投稿もカスタムフィールドも使っております。
bookというcustom post typeがあり、そのなかでbook_authorというcustom fieldsがあります。

カスタム投稿(book)の特定のカスタムフィールド(book_author)に変更があったとき:最終更新日変更
カスタム投稿(book)の本文または他のカスタムフィールドが書き換えられたとき:最終更新日を更新しない
通常投稿(post)やbook以外のカスタム投稿が更新されたとき:通常通りの仕様で最終更新日変更
この説明で伝わりますでしょうか?お手数をおかけします。よろしくお願いいたします。

**追記3
現在以下のようなコードを書いています。
カスタム投稿(book)の場合、というif文は問題なく動いているのですが、
その後のカスタムフィールドの中身の比較のところでやはり躓いています。
間違っている部分おわかりになれば、ご教示いただけると幸いです。

PHP

1function section_post_modified( $data, $postarr ) { 2 global $post; 3 $post_id = $post->ID; 4 if ( $data['post_type'] == 'book') { 5 $book_val = get_post_meta( $post_id, 'book_author'); 6 $book_new = $_POST['book_author']; 7 if( $book_val == $book_new ){ 8 unset( $data["post_modified"] ); 9 unset( $data["post_modified_gmt"] ); 10 } 11 } 12 return $data; 13}; 14add_filter( 'wp_insert_post_data', 'section_post_modified', 10, 2 );

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2018/10/09 23:09

ご自身で、調べたこと・試したことは何かありますか?
CHERRY

2018/10/10 03:17

あと「カスタム投稿(custom post type)」と「カスタムフィールド( custom fields)」は、まったく異なるものですが、どちらを利用されていますか?
kuroinekosuki

2018/10/10 05:33 編集

CHERRYさま、お返事ありがとうございます。本文中の追記にてお答えさせていただきました。どうぞよろしくお願いたします。
guest

回答3

0

その後のカスタムフィールドの中身の比較のところでやはり躓いています。
間違っている部分おわかりになれば、ご教示いただけると幸いです。

get_post_meta() で、保存済みのデータを参照されていますが、get_post_meta() は、関数リファレンス/get_post_meta

$single(真偽値) (オプション) true をセットした場合、文字列として単一の結果を返します。false または値をセットしなかった場合、関数はカスタムフィールドの配列を返します。

と記載されている通り、配列で値が帰ってきます。

値を比較する場合は、配列の最初の値と比較するか 第3引数を true にして、単独の値で返すようにします。

また、$_POST を使われていますが、 $data と $postarr に投稿の更新データが送られてくるので、それを利用する方が簡単だと思います。


ところで、カスタムフィールドは、どうやって作成されているのでしょうか?

カスタムフィールド設定のプラグインを使っている場合、入力画面のフィールド名を変えている場合もありますので、$_POST['book_author'] で値が取れるとは限りません。

下記では、カスタムフィールドは、メジャーな(ダウンロード数が多い) Advanced Custom Fields (ACF) を使って作成したと仮定して記載します。

まず、WordPress ダッシュボードの投稿画面の HTML ソースを開いて、「book_author」を検索して、ACFカスタムフィールドの ID を探します。

おそらく次のような行があると思いますので、input の name を確認してください。(または、data-key の値 または、id や class でつかわrている acf-field_5bbdb379baea9acf- を取り除いた field_5bbdb379baea9 の部分でも判断できますが...)

下記の場合、acf[field_5bbdb379baea9]が、name に指定されていますので、field_5bbdb379baea9 が、フィールドID をわかります。

<div class="acf-field acf-field-text acf-field-5bbdb379baea9" data-name="book_author" data-type="text" data-key="field_5bbdb379baea9"> <div class="acf-label"><label for="acf-field_5bbdb379baea9">book_author </label></div> <div class="acf-input"> <div class="acf-input-wrap"><input type="text" id="acf-field_5bbdb379baea9" name="acf[field_5bbdb379baea9]" value="" /></div> </div> </div>

上記の acf[field_5bbdb379baea9] の場合、ACFカスタムフィールドのフィールドIDが、 field_5bbdb379baea9 なので、postarr に $postarr["acf"]["field_5bbdb379baea9"] で値を確認できるます。


ということで、上記を元に修正してみました。

function section_post_modified( $data, $postarr ) { global $post; $post_id = $post->ID; if ( $data['post_type'] == 'book') { $book_val = get_post_meta( $post_id, 'book_author'); $book_new = $postarr["acf"]["field_xxxxxxxx"]; // 上記の ACF のフィールド名 if( $book_val[0] == $book_new ){ // カスタムフィールドbook_author 配列の1つめのデータと比較 unset( $data["post_modified"] ); unset( $data["post_modified_gmt"] ); } } return $data; }; add_filter( 'wp_insert_post_data', 'section_post_modified', 10, 2 );

投稿2018/10/10 10:04

CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

get_post_meta( $post_id, 'book_author');の結果は配列になるから駄目ね。
get_post_meta( $post_id, 'book_author',true);にしないと駄目ね。

get_post_meta

投稿2018/10/10 08:21

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

お二人ともありがとうございます!頂いた回答を元にコードを修正してみたところ、うまく動く場合と動かない場合があり、頭を抱えておりましたが、「お二人が書いてくださった部分は間違っていないはず!」と考えてその他の部分を書き換えて動作を試していましたら、なんとか解決しました。
カスタムフィールドの中身が単語などの短いワードだと問題ないのですが、タグ(改行?)が混ざっていた場合は、いくら比較をしても一致しないことがわかりました。
なので、wp_strip_all_tagsでタグを除去してから比較してみたところ、見事一致しました!
100%データが取れていないのが原因だと思っていたので、たいっっっっへん助かりました!
(そしてカスタムフィールドの中身にタグが混ざっている場合もあることを記載せず大変申し訳ございません。まさかここに原因があるとは思ってもいなかったので、完全に意識の外でした…。)

以下、四苦八苦したコードです。

PHP

1function section_post_modified( $data, $postarr ) { 2 global $post; 3 $post_id = $post->ID; 4 if ( $data['post_type'] == 'book') { 5 $book_val = wp_strip_all_tags(get_post_meta( $post_id, 'book_author', true),true); 6 $book_new = wp_strip_all_tags($_POST['book_author'],true); 7 if ( strcmp($book_val, $book_new) == 0 ) { 8 unset( $data["post_modified"] ); 9 unset( $data["post_modified_gmt"] ); 10 } 11 } 12 return $data; 13}; 14add_filter( 'wp_insert_post_data', 'section_post_modified', 10, 2 );

皆様ありがとうございました。これで安らかに眠れます。

投稿2018/10/13 07:16

kuroinekosuki

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問