サポート » 使い方全般 » wp_mailの本文にループで取得したものを入れたい

  • 解決済 d.w.c

    (@dwc-1)


    wordpressのwp_mailで送るメールの本文部分にループで取得した文字列を入れたいのですが、コードの書き方がわかりません。
    ループする部分はACFプラグインを使用してカスタムフィールドに作成しています。

    いろいろ書いてみてすべて失敗しているんですが、とりあえず書いた一例を下に載せておきます
    ベースのコードはACFを使用してコンタクトフォームを送信するためのものです。
    https://www.advancedcustomfields.com/resources/using-acf_form-to-create-a-new-post/

    $item = 'あああ';などにすると普通に動くので$itemの中身の指定方法が問題なんだと思うのですが、配列の内容を文字列にして取得する方法で他にいいものはありますでしょうか。

    《functions.php》
    
    $item_list  = get_field('items', $post_id );
    if( $item_list ){
    	foreach( $item_list as $row ){
    		$item   = $row[ 'item' ];
    		$cost   = $row[ 'cost' ];
    		$number = $row[ 'number' ];
    		$memo   = $row[ 'memo' ];
    		
    		$items[] = $item . ': ' . $cost . '円 × ' . $number . '個 _' . $memo ;
    	}
    }
    
    $item    = implode( ',' , $items );
    
    // email data
    $to      = '***@mail';
    $subject = 'テスト' ;
    $body    = $item;
    
    // send email
    wp_mail( $to, $subject, $body );
6件の返信を表示中 - 1 - 6件目 (全6件中)
  • こんにちは

    ACF側がどうなっているのか分からないのですが、繰り返しフィールドを使っているのでしょうか?

    コメントありがとうございます。
    はい、繰り返しフィールドを使用しています。

    通常のテンプレート上では、

    <?php 
    foreach( $item_list as $row ){
    	$item   = $row[ 'item' ];
    	$cost   = $row[ 'cost' ];
    	$number = $row[ 'number' ];
    	$memo   = $row[ 'memo' ];
    	
    	echo '<div>' . $item . ': ' . $cost . '円 × ' . $number . '個 _' . $memo . '</div>';
    }
    ?>

    とするとHTMLは

    <div>石鹸: 150円 × 10個 _ストック用</div>
    <div>ハブラシ: 100円 × 5個 _安売りで購入</div>

    等のようになるのを確認しています。

    それでは、どこで失敗しているかは確認されているでしょうか?

    それぞれの代入結果は確認されていますか?

    $item = $row[ 'item' ];

    $items[] = $item . ': ' . $cost . '円 × ' . $number . '個 _' . $memo ;

    $item = implode( ',' , $items );

    $body = $item;

    • この返信は1 日、 12 時間前に  munyagu さんが編集しました。

    代入結果は確認しています。
    2つ目の投稿の例をとると
    $item = $row[ 'item' ];
    石鹸 ハブラシ などの入力したテキスト

    $items[] = $item . ': ' . $cost . '円 × ' . $number . '個 _' . $memo ;
    Array ( [0] => 石鹸: 150円 × 10個 _ストック用 [1] => ハブラシ: 100円 × 5個 _安売りで購入 )

    $item = implode( ',' , $items );
    石鹸: 150円 × 10個 _ストック用,ハブラシ: 100円 × 5個 _安売りで購入

    $body = $item;
    石鹸: 150円 × 10個 _ストック用,ハブラシ: 100円 × 5個 _安売りで購入

    となっています。
    失敗箇所は、
    $body代入直前の$item$item = 'あああ';などの文字列にすると普通に動くので$itemの中身の指定方法が問題なんだと思っています。

    現状ですとメールの送信自体が行われません。

    コードを書いた時点で$itemを2重に使っていてわかりにくかったですね…すみません。
    ただ、最終的に欲しい文字列での上書きをしているだけなのでとりあえず$itemの重複は動作に対しては問題ではないと考えています。

    • この返信は1 日、 11 時間前に  d.w.c さんが編集しました。

    メールの送信自体が行われないのであれば、サーバーのエラーログに何か出力されているのではないでしょうか。

    WordPressのデバッグモードを有効にしてもいいかもしれません。
    https://wpdocs.osdn.jp/WordPress%E3%81%A7%E3%81%AE%E3%83%87%E3%83%90%E3%83%83%E3%82%B0

    一度すべて消して再度最初と同じコードを書いてみたところ、メールが送信できるようになりました。
    どこかにゴミが混ざっていたようです・・・。
    いろいろ考えていただいたのにこんな原因ですみません。

    $item = implode( ',' , $items );$item = implode( "\r\n" , $items );とすることで$itemsの配列の内容を改行してリスト表示することもできました。

6件の返信を表示中 - 1 - 6件目 (全6件中)
  • このトピックに返信するにはログインが必要です。