気ままに

プログラム関連で困ったことを調べて気ままに投稿

【WordPress】ショートコードAPIを使った管理画面からの関数実行

short codeを使った管理画面からの関数実行

WordPressを使ったサイトで、「お問い合わせ」をメールフォームを使わないで、リンクからメーラーを立ち上げる方法で対応した際に、IEの8以下だと文字化けてしまった為、ブラウザを判定して文字コードを変更する関数を作成しました。


ところが、the_contents()関数で表示されるHTMLにお問い合わせリンクが含まれている場合、その関数が使えない。プラグインを入れて、the_contents()にPHPJavaScriptのコードを書いて文字コードを変更する処理を書くことは可能だが、セキュリティー上の問題が発生しやすくなる為止めた方がいい。

そこで、メディアを管理しているギャラリー機能で使われているショートコードAPIを使えば、解決できることがわかったので、その方法を書いてみようと思います。

お問い合わせのリンクでメーラを起動する関数

関数の処理概要

ブラウザによって文字コードを変換する
クローラー対策用にメールアドレスの文字コードエンコードする
メール本文に改行を含めることが可能


以下、作成したメール送信のaタグの部分を作成する関数。

<?php
function createMailLink($to_address, $subject = null, $body = null)
{
  $mail_html = "";
  $str_encode = 'UTF-8';
 
  // ブラウザ判定
  if (stristr($_SERVER['HTTP_USER_AGENT'], "msie")) {
    // IE
    $str_encode = 'SJIS';
    $subject = mb_convert_encoding($subject, $str_encode);
    $body = mb_convert_encoding($body, $str_encode);
  }
  
  if (empty($to_address)) {
		
    return null;
  } else {
    $to_address = htmlentities($to_address, ENT_HTML5, $str_encode);
  }
  
  if (!empty($subject)) {
    $mail_html .= 'subject=' . urlencode($subject) . "&";
  }
  if (!empty($body)) {
      $body = urlencode($body);
      $mail_html .= 'body=' . $body;
  }
  $mail_html = "mailto:" . $to_address. '?' . $mail_html;
 
  return $mail_html;
}
?>


今作った関数をそれぞれのページの.phpで使用する場合は、

<?php
// 改行を含めたメール本文を作成
$body = "下記の内容をご記入の上、お問い合わせください
■ご連絡先

■お問い合わせ内容
";
?>
<a href="<?php createMailLink("info@test.com", "お問い合わせ", $body); ?>">お問い合わせ</a>

メールが立ち上がった時の画面
f:id:unot13:20140402140204p:plain


ショートコードAPIの設定

ショートコード用の関数登録処理の書き方、第1引数のcreate_mailtoがショートコード名、第2引数がショートコードを実行する時の関数名(create_mailto_handler)となる。

<?php
// ショートコード対応
add_shortcode('create_mailto', 'create_mailto_handler');
?>


ショートコード用関数(create_mailto_handler)では、管理画面で使えるパラメータを受け渡す処理書きます。
shortcode_atts の第1引数に設定する配列は、設定できるパラメータ名と初期値を設定します。
そして、createMailLink関数に受け取った内容をそのまま設定して実行しています。

<?php
function create_mailto_handler($atts, $content=null)
{
  extract( shortcode_atts( array(
    'to_address' => 'info@test.com',
    'subject' => '',
    'body' => '',
  ), $atts ) );
  
  return createMailLink($to_address, $subject, $body);
}
?>


管理画面のコンテンツ入力画面では、どういった記述をすることになるかというと、

お問い合わせは、<a href="[create_mailto to_address="info@test.com" subject="問い合わせ" body=""]">こちら</a>から

と書くことで、PHPの処理を実行するが可能です。プラグインを入れるよりも、shortcodeを使うことで、共通の関数が使えるので利便性が向上しました。

ショートコードAPIを使った場合のソース全体


WordPress でHTMLのa mailto:を使った文字列を生成する関数と、管理画面の入力から ...


初めて、gistからソースコードを公開してみました。使ったばかりなので、WEBからだとインデントが崩れたりしてうまくいきませんでした。慣れるには、もう少し時間がかかりそうです。


まだブログを書くのに時間がかかってしまっているので、書く頻度をもう少し増やそうと思うのですが、週に1つくらいになってしまってます。これ以上減らさないようにしながら、マイペースで書いていこうと思います。