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

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

ただいまの
回答率

90.51%

  • PHP

    23999questions

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

  • WordPress

    8921questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 393

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

具体的に言いますと

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

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

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

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

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

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

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

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

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 = $_POST['book_author'];
        if( $book_val == $book_new ){
            unset( $data["post_modified"] );
            unset( $data["post_modified_gmt"] );
        }
    }
    return $data;
};
add_filter( 'wp_insert_post_data', 'section_post_modified', 10, 2 );
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • CHERRY

    2018/10/10 08:09

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

    キャンセル

  • CHERRY

    2018/10/10 12:17

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

    キャンセル

  • kuroinekosuki

    2018/10/10 14:25 編集

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

    キャンセル

回答 3

+3

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

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_5bbdb379baea9 の acf- を取り除いた 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 );

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

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

get_post_meta

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

check解決した方法

0

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

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

function section_post_modified( $data, $postarr ) {
    global $post;
    $post_id = $post->ID;
    if ( $data['post_type'] == 'book') {
        $book_val = wp_strip_all_tags(get_post_meta( $post_id, 'book_author', true),true);
        $book_new = wp_strip_all_tags($_POST['book_author'],true);
        if ( strcmp($book_val, $book_new) == 0 ) {
            unset( $data["post_modified"] );
            unset( $data["post_modified_gmt"] );
        }
    }
    return $data;
};
add_filter( 'wp_insert_post_data', 'section_post_modified', 10, 2 );


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • PHP

    23999questions

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

  • WordPress

    8921questions

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

  • トップ
  • PHPに関する質問
  • wordpressの記事最終更新日を「特定のカスタムフィールドが更新されたときだけ」更新したい