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

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

ただいまの
回答率

90.51%

  • PHP

    23033questions

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

  • WordPress

    8495questions

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

  • メール

    290questions

    メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

  • POST

    263questions

    POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

【WordPress】get_field('フィールド名',$post_id)の投稿IDの取得・表示について

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,297

e.k.

score 3

前提・実現したいこと

WordPressでAdvancedCustomFieldを使用し、投稿ページにカスタムフィールドを作成しました。
投稿ページに投稿された内容をwp_mailを使い、投稿の公開時に送信されるメール本文に反映したいと考えています。

発生している問題・エラーメッセージ

投稿IDが取得されず、カスタムフィールドの値がメールに反映されません。

該当のソースコード

add_action( 'transition_post_status', function( $new_status, $old_status, $post ) {
  if ( 'publish' == $new_status  &&  'publish' != $old_status && 'post' == $post->post_type ) {
    $header = array( 'From: from@example.com' );

    $post_id = get_post();
    $post_id->ID;
    $post_id = $post_id->ID;
    $customfield = get_field('project', $post_id);

    $message .= "--------------------------------------\r\n";
    $message .= $customfield ."\r\n";
    $message .= "--------------------------------------\r\n\r\n";
        wp_mail( 'to@example.com', $post->post_title, $message, $header );
  }
}, 10, 3 );

試したこと

$customfield = get_field('project', $post_id);
この箇所の$post_idに実際の投稿IDを記載した場合、そのIDの該当カスタムフィールドの値は
メール本文に表示されました。
例: get_field('project', 123)

また、$post_idを$message部分にいれたところ、公開したIDの数値が表示されました。
例:$message .= $post_id ."\r\n";

よって投稿IDは取得されており、get_fieldも使用できているようです。
get_field()の$post_idに変数が使用不可ということなのでしょうか。

php初心者のため、基本的な箇所で間違いがありましたら申し訳ございません。
ご指導・ご鞭撻何卒宜しくお願い致します。

補足情報(言語/FW/ツール等のバージョンなど)

WordPressのバージョン 4.7.3

【追記】
皆さまご教示ありがとうございます。

以前にも試していましたが、その際は表示されない原因が特定できなかったので
改めてこちらの書き方も試してみました。
get_post_meta($post_id, $key, $single);

例:$message = get_post_meta($post_id, 'project', true);

結果としては同じく投稿IDが取得できていないようです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+2

投稿の情報を取得するget_post()はループ内で使用することで投稿情報が取得できます。

今回はアクションフックのコールバック関数の引数$postから取得できるのではないでしょうか

以下のソースで投稿IDが取得できるかお試しください。

// 以下のソースを差し替えてIDを取得
// $post_id = $post_id->ID;
$post_id = $post->ID;

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/04/27 14:24

    koou様、ご教示ありがとうございます。
    試してみましたが、カスタムフィールドの値は表示されませんでした。
    もう少し試行錯誤してみます。

    キャンセル

checkベストアンサー

+1

引数に $post が来ているのでそれを使えば良いのではないでしょうか。

// $post_id = get_post();
// $post_id->ID;
// $post_id = $post_id->ID;
   $post_id = $post->ID;

追記:

$_POST から拾うとか。

【記事を保存したときにAdvanced Custom Fieldsで設定したフィールドの値を取得する。 – Toro_Unit】
https://torounit.com/blog/2013/05/22/1544/

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/04/27 14:24

    kei344様、ご教示ありがとうございます。
    試してみましたが、カスタムフィールドの値は表示されませんでした。
    もう少し試行錯誤してみます。

    キャンセル

  • 2017/04/27 17:12

    kei344様、追記でもご指南を頂き誠にありがとうございます。
    リンク先を参照し、記事の保存時にはカスタムフィールドの値がDBに保存されないということをはじめて知りました。
    そうだとすると、記述の誤り等で表示されないわけではなく、また投稿IDが取得できていないわけではなく、カスタムフィールドの値の取得を公開と同じタイミングで行ってしまっているため、取得できていないということでしょうか。
    まずは記述に習い試してみましたが、上手くいかず、もう少し試してみたいと思います。
    大変参考になるご意見ありがとうございます。もしも記述例など他にもお教え頂けるようでしたら、何卒宜しくお願い致します。

    キャンセル

  • 2017/04/27 17:42

    記事保存は、基本情報の保存が行われ、カスタムフィールドの保存が行われる、という順番で行われます。フックの位置によってはそれが「更新」か「新規」かの判別ができなかったりするので、案外難しいところです。
    ACFの更新フック(新規作成フック)を探し、それにフックする形でメール送信されてはいかがでしょう。

    キャンセル

  • 2017/05/01 15:18

    kei344様、重ねてのアドバイス誠にありがとうございます。
    その後様々な方法を試し、do_actionを使用することで最新のカスタムフィールドの値を取得する事ができました。
    記事公開時にカスタムフィールドの値が保存されないという着眼点を示して頂き大変参考になりましたので、ベストアンサーにさせて頂きました。
    お忙しいところありがとうございました。

    キャンセル

+1

自己解決ではなく質問に回答頂いたお2人のアドバイスを参考にさせて頂きましたが、上手くいった方法を改めてこちらに記載します。

最初に投稿したコードの、

 if ( 'publish' == $new_status  &&  'publish' != $old_status && 'post' == $post->post_type ) {


の下に

do_action('save_post', $post->ID);


を記載することで、最新のカスタムフィールドの値を取得し、メール本文に反映させることができました!
kei344様、koou様ご回答誠にありがとうございました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • PHP

    23033questions

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

  • WordPress

    8495questions

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

  • メール

    290questions

    メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

  • POST

    263questions

    POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。