tips

Email Template Previewer for WooCommerce

Previewing the email templates by placing orders. I think it should be an official option.
I modified the built in WooCommerce functions.

add_filter('woocommerce_mail_content', function( $message ){

  if ( is_admin() && isset( $_GET['preview_woocommerce_mail'] ) && isset( $_GET['_wpnonce'] ) ) {

    // Temporarily overwrite order status
    add_filter('woocommerce_order_has_status', function( $return, $order, $status ){
        if ( isset( $_GET['email'] ) ){
            $return = $status == strtolower( str_replace( ['WC_Email_','Customer_','_Order','_'],['','','','-'], $_GET['email'] ) );
        }
        return $return;
    }, 10, 3 );

    // Include woocommerce subscription
    add_filter( 'wc_get_template', function ( $template, $template_name, $args, $template_path, $default_path ){
      if ( isset( $args['email']->template_base ) && !file_exists( $template ) && file_exists( $args['email']->template_base.$template_name ) ){
        $template = $args['email']->template_base.$template_name;
      }
      return $template;
    }, 1, 5);

    $form = '<form method="get" id="preview_email" class="wp-core-ui" action="'.admin_url().'">'."\n";
    $form .= '<input type="hidden" name="preview_woocommerce_mail" value="true">'."\n";
    $form .= '<input type="hidden" name="_wpnonce" value="'.$_GET['_wpnonce'].'">'."\n";
    $form .= '<select id="preview_email_type" name="email" class="regular-text">'."\n";
    $form .= '<option value="">'.__( 'Email', 'woocommerce' ).'</option>'."\n";
    $wc_emails = WC_Emails::instance();
    $emails = $wc_emails->get_emails();
    foreach ( $emails as $key => $val ):
      $form .= '<option value="'.$key.'"'.( isset( $_GET['email'] ) && $_GET['email'] == $key ? ' selected="selected"': '' ).'>'.$val->title.'</option>'."\n";
    endforeach;
    $form .= '</select>'."\n";

    $orders = get_posts( array( 'post_type' => 'shop_order', 'posts_per_page' => 20, 'post_status' => array_keys( wc_get_order_statuses() ) ) );
    $form .= '<select id="preview_email_order" name="order" class="regular-text">'."\n";
    $form .= '<option value="">'.__( 'Order ID', 'woocommerce' ).'</option>'."\n";
    foreach ( $orders as $order ):
      $form .= '<option value="'.$order->ID.'"'.( isset( $_GET['order'] ) && $_GET['order'] == $order->ID ? ' selected="selected"': '' ).'>#'.$order->ID.'</option>'."\n";
    endforeach;
    $form .= '</select>'."\n";
    $form .= '<button id="preview_email_button" type="submit" class="button button-primary" value="preview_woocommerce_mail">'.__('Preview', 'woocommerce').'</button>'."\n";
    $form .= '</form>'."\n";
    $form .= '<style>#preview_email { display:flex; align-items: flex-start; position:fixed; top:8px; left:8px; right:8px; flex-wrap:nowrap; } #preview_email select { font-size:14px; color: #32373c; border:1px solid #7e8993; box-sizing: border-box; box-shadow: none; display:block; border-radius:2px; padding: 0 24px 0 8px; line-height:30px; height:32px; -webkit-appearance: none; background: #fff url(\'data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D%2220%22%20height%3D%2220%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%3E%3Cpath%20d%3D%22M5%206l5%205%205-5%202%201-7%207-7-7%202-1z%22%20fill%3D%22%23555%22%2F%3E%3C%2Fsvg%3E\') no-repeat right 5px top 55%; background-size: auto; background-size: 16px 16px; cursor: pointer; vertical-align: middle; margin-right:4px; } #preview_email_type { max-width:calc( 100% - 200px ); } #preview_email_order { width:96px; } #preview_email_button { background: #007cba; border:1px solid #007cba; color: #fff; text-decoration: none; text-shadow: none; text-decoration: none; font-size: 14px; width:96px; line-height:32px; height: 32px; margin: 0; padding:0 8px; cursor: pointer; -webkit-appearance: none; border-radius:2px; nowrap; display:block; box-sizing: border-box; } </style>'."\n";

    if ( !empty( $_GET['email'] ) && !empty( $_GET['order'] ) ){
      global $email;
      $email = new WC_Email();
      $email = $emails[ $_GET['email'] ];
      $order = wc_get_order( $_GET['order'] );
      if ( $_GET['email'] == 'WC_Email_Customer_Reset_Password' || $_GET['email'] == 'WC_Email_Customer_New_Account' ){
        if ( !empty( $order->get_user_id() ) ){
          $email->object = new WP_User( $order->get_user_id() );
          $email->user_id = $email->object->ID;
          $email->reset_key = 'XXXXXXXXXXXX';
          $email->user_login = stripslashes( $email->object->user_login );
          $email->user_email = stripslashes( $email->object->user_email );
          $email->recipient = $email->user_email;
          $email->password_generated = '';
          $email->set_password_url = '';
        }
      } else {
        $email->object = $order;
        $email->find = array('{order_date}', '{order_number}', '{order_billing_full_name}');
        $email->replace = array( wc_format_datetime( $email->object->get_date_created() ),       $email->object->get_order_number(), $email->object->get_formatted_billing_full_name() );
        $email->recipient = $order->get_billing_email();
      }
      $email->get_subject();
      $args = array(
        'email' => $email,
        'order' => $email->object,
        'email_heading' => $email->get_heading(),
        'additional_content' => $email->get_additional_content(),
        'blogname' => $email->get_blogname(),
        'sent_to_admin' => 'WC_Email_Customer' != substr( $_GET['email'], 0, 17 ),
        'plain_text' => ( 'plain' === $email->get_email_type() ? true : false ),
      );
      if ( isset( $email->user_login ) ){
        $args['user_id'] = $email->user_id;
        $args['user_login'] = $email->user_login;
        $args['reset_key'] = $email->reset_key;
      }
      if ( stripos( $email->template_html, 'subscription' ) !== false || stripos( $email->template_html, 'switch' ) !== false ){
        if ( $subscriptions = wcs_get_subscriptions_for_order( $order->get_id() ) ){
          foreach( $subscriptions as $subscription_id => $subscription_obj ){
            if( $subscription_obj->order->id == $order->get_id() ) {
              break;
            }
          }
          $email->subscription = $args['subscription'] = $subscription_obj;
        } else {
          $subscriptions = wcs_get_subscriptions( array(
            'subscriptions_per_page' => 1,
            'subscription_status' => array('active') // Active subscriptions
          ));
          if ( $subscriptions ){
            $email->subscription = $args['subscription'] = current($subscriptions);
          } else {
            $email->template_html = '';
          }
        }
      }
      ob_start();
      wc_get_template( $email->template_html, $args );
      $message = ob_get_clean();
      if ( 'plain' === $email->get_email_type() ) {
        $message = '<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>'.get_bloginfo( 'name' ).'</title></head><body leftmargin="0" marginwidth="0" topmargin="0" marginheight="0" offset="0"><div style="white-space:pre-wrap; background-color:white; padding:4em 1em; max-width:1000px; margin:0 auto;">'.$email->get_content().'</div></body></html>';
      }
      $message = $email->style_inline( $message );// wrap the content with the email template and then add styles.
    }
    $message = str_replace( '</body>', $form.'</body>', $message );
  } 
  return $message;
}, 99 );

「My upload images : メディアアップローダー付きのカスタムフィールドを設置するプラグイン。」への6件の返信

  1. 初めまして。

    add images をメディアライブラリを通さずに、ローカルから直接「ファイルを選択」でアップすることは可能でしょうか。
    その一点のみが懸念点でして、それが可能であれば是非使用させていただきたいのですが…
    ご確認いただけますと幸いです。
    よろしくお願いいたします。

    1. このプラグインは、通常の「メディアを追加」ボタンと同じ動作をします。

      「ファイルをアップロード」タブを選択すると、「アップロードするファイルをドロップ」または「ファイルを選択」から画像をアップロードすることができます。

  2. はじめまして。

    使わせてもらっています。
    まさに求めていたものそのままの機能で感激いたしました。
    jqueryのスライダーと合わせて使わせていただいてます。

    一つだけ教えてほしいのですが、
    記事の「設置&出力方法」のサンプルコードに追加で
    画像のキャプションを取得する方法はないでしょうか?
    お時間がありましたら教えていただけると助かります。
    よろしくお願いします。

    1. まだプラグインではなかったときの記事の名残があちこちにあって、出力例も含めていろんな箇所が怪しさ満載でしたので、目に付いた箇所だけ直しておきました。

      出力例の箇所に「タイトル・キャプション・代替テキスト・説明」のすべての出力ができるようなサンプルコードを書いておきました。適当にカスタマイズしてください。

    2. お早いお返事ありがとうございます。

      無事キャプションを呼び出すことができました!
      とても便利なプラグインなのでこれからも応援しております。

  3. はじめまして。

    まさに欲しかった機能にぴったりのプラグインで大変助かっています。

    そこで1つ気になるところがありました。
    wordpressをdebugで実行していると、Noticeが多数出力されているようです。
    動作には特に問題はないですが、気になりましたのでコメントさせていただきました。

    1. ご報告ありがとうございます。

      返信が遅くなりました。
      他のプラグインもerror_reportingでチェックしただけでWP_DEBUGをしてません。裏側で出ているnoticeはそのうちそのうちと、思いつつ無視してました^^;

      とりあえずmy upload imagesだけやって1.3.5にアップデートしました。
      おいおい、他のも・・・?

  4. お世話になります

    参考になりました

    一つ質問ですが、
    あと、テーマ内で使用するには、ループ中でカスタムフィールドの配列を呼び出して下さい。
    とありますが、これはどこで呼び出せばいいですか?
    function.phpの中でしょうか、テンプレートのphpファイルでしょうか??

    1. >function.phpの中でしょうか、テンプレートのphpファイルでしょうか?


      テンプレートのphpファイルの中です。singleやctegoryなどのループの中でカスタムフィールド値を呼び出すときと同じように設置してみてください。

    2. お世話になります

      ありがとうございます
      マイアップロード画像を管理画面に表示できました。

      しかし選んだ画像をテンプレートファイルに書き込むのが出来てません・・・

      画像をアップロードして、
      画像を選択すると、アイテム画像の追加削除の下に、
      選択した画像が出ます。

      しかし、公開(または更新)ボタンを押すと、
      表示されていた画像が消えてしまうのですが、
      これはデータベースへの書き込みが上手く行っていないのでしょうか?

      重ね重ね質問で申し訳ございません。。

      ご教示いただけたら幸いです。。

    3. >これはデータベースへの書き込みが上手く行っていないのでしょうか?

      試しにここで提示している関数群を丸ごとコピペして確認してみましたが、こちらでは問題なく動作しています。
      初歩的なことを伺いますが、きっちりとコピーできているか確認して下さい。また、phpのタグ 

      <?php

       と 

      ?>

       がfunctions.php内に元々あったタグと重複したりしていませんか?

    4. ありがとうございます。

      metabox.phpというファイルにまるごとコピペして
      function.phpでrequire(‘metabox.php’);という形で、
      読み込んでますので、そういうミスはないかと・・・

      書き換えたのは、私の場合投稿ではなく、カスタム投稿タイプで使いたいので、
      add_meta_boxの引数を
      add_meta_box( ‘my_upload’, ‘マイアップロード画像’, ‘my_upload_postmeta’, ‘work’, ‘normal’,’high’ ); // ポジションはsideが推奨

      とpostからカスタム投稿タイプのworkに書き換えただけです。。。

      他にカスタムフィールドを使っていますので、
      それの書き込み関数とバッティングしているとかありますでしょうか??

      XAMPP1.8.3 PHP5.5.6で動かしています。。。

    5. 何パターンかのカスタム投稿タイプで確認済みです。

      はるのぶさんの指定方法でカスタム投稿タイプ「work」に対してそのまま使えるかと思います。

      画像が書き込まれないという症状からすると、カスタム投稿タイプのサポート設定の’capability_type’がデフォルトではないか’post’か’page’以外のものに指定されているためにパーミッションチェックを通らない、という可能性が考えられます。

      capability_typeの設定が別のものになっていて、かつこだわりがなければ’post’に設定してみて下さい。
      capability_typeが変更できない理由がある場合、save_my_upload_postmeta関数内の分岐箇所 ( ‘page’ == $_POST[‘post_type’] )以下を次のように書き換えてみてください。(未検証です)

      if ( 'page' == $_POST['post_type'] ) {
          if ( !current_user_can( 'edit_page', $post_id ) ) // パーミッションチェック
          return $post_id;
      } elseif ( 'work' == $_POST['post_type'] ) {
          if ( !current_user_can( 'edit_work', $post_id ) ) // パーミッションチェック
          return $post_id;
      } else {
          if ( !current_user_can( 'edit_post', $post_id ) ) // パーミッションチェック
          return $post_id;
      }

      試しに上記パーミッションチェックの箇所をすべて削除してみてもらえば、そこが原因かどうか分かると思います。

    6. ありがとうございます。

      capability_typeは設定されていませんでしたので、
      ‘post’にしてみましたが、現象変わらず、
      また、パーミッション設定をはずしたり、
      教えていただいたコードに変えましたが、
      現象変わらずです。。。

      あとはどこも変えてないです。

      他にもカスタム投稿タイプの中で、
      カスタムフィールドは使っていますが、
      それは保存されています。。。

      初心者なので、どこをどう調べてよいか分からず、困っています。。。

      申し訳ございませんが、
      よろしくお願いします。。。

    7. いただいたfunctions.phpを見ました。

      58行目の echo $my_upload_li を echo isset($my_upload_li) に改変されているのが原因です。

      この機に、変数の定義ミス警告が出ないようにコードもアップデートしておきますので、そちらをお使いください。

  5. 反映ありがとうございます。

    p.media.controller.Libraryで指定した設定ですと、メディアライブラリを一度選択すと画像を選択するのボタンが変になるのはこちらの検証環境のみでしょうか?

    1. エラーのご報告ありがとうございます。

      今までまったく気がついてませんでした。
      左のツールバーはプロパティの設定を反映させるために表示されていただけで、本来不要なのでjQueryで無理矢理取り除くことにしました。ボタンのテキストが消える原因は調べてないのですが、これで画面遷移がなくなるので、結果オーライで^^;

      なお、同様のアップローダーを使っていたウェルカート用プラグインはそもそも添付画像しか見えなくていいので、もっとシンプルな仕様に変更しておきました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です