サイト運営に不可欠なお問い合わせフォーム。「Contact Form 7」はWordpressで作られたサイトにお問い合わせフォームを設置する際に便利なプラグインです。特別な知識なく簡単にフォームを組み込むことができ、ほとんどのことはContact Form 7に用意された機能で実現可能なので重宝しています。

さて、企業サイトにお問い合わせフォームを設置する場合は送信ボタンの前にプライバシーポリシーを掲載することがあります。静的にHTMLで記述するだけなら作業としては簡単なのですが、たいていサイト内にはすでにプライバシーポリシーページがあるので、どうせならその内容を自動的にそのまま読み込むようにしたいと思いますよね。フォームが複数になれば掲載するプライバシーポリシーの箇所も複数になりますし、プライバシーポリシーが改訂されるたびに何箇所も箇所を修正するのは手間がかかりますから。

方法としてはショートコードを使うことが考えられます。プライバシーポリシーページ(固定ページ)のpost_contentを取得して表示するという単純な処理です。

通常、ショートコードを追加するにはadd_shortcode()という関数を使いますが、実はContact Form 7のフォーム内ではWordpress標準のショートコードを使うことができません。そこで代わりにwpcf7_add_form_tag()という関数を使ってContact Form 7用のショートコードを追加します。
(wpcf7_add_shortcode()は非推奨となりました。)

wpcf7_add_form_tag('sc_privacy', 'func_sc_privacy');
function func_sc_privacy() {
  $privacy_content = '';
  $privacy_posts = get_posts ( 'post_type=page&pagename=privacy' );
  foreach ( $privacy_posts as $privacy_post ):
    $privacy_content = $privacy_post->post_content;
    $privacy_content = apply_filters('the_content', $privacy_content);
  endforeach;
  return $privacy_content;
}

ここではプライバシーポリシーページのスラッグを「privacy」としています。ここを変更すれば任意の固定ページのコンテンツを取得することができます。
このショートコードを使ってフォームに掲載する方法は標準のショートコードと同じで、Contact Form 7のフォーム投稿内で、

[sc_privacy]

と書くだけです。

WordPressに記事を追加する場合、通常は管理画面を使って投稿しますが、メールを使って簡単・手軽に投稿することもできます。ただし実装方法はいくつかあって、それぞれ一長一短があります。

1.標準機能を使う

事前準備

メール投稿用のメールアドレス(メールアカウント)を作成しておきます。レンタルサーバ上に作成してもよいですし、Gmailを使ってもかまいませんが、このアドレスに送信されたものが記事投稿になるので専用のアドレスを新規作成するのがよいです。

設定

管理画面「設定」->「投稿設定」に「メールでの投稿」という項目があります。ここに事前準備で作成したメールアカウントの情報を入力します。「メール投稿用カテゴリーの初期設定」には、投稿が登録されるカテゴリを指定します。

投稿

設定したメールアドレス宛にメールを送信します。件名が記事タイトル、本文が記事本文となります。添付ファイルの処理はされないので画像を投稿することはできません。

このとき、送信元メールアドレスはWordpressにユーザ情報として登録されているメールアドレスである必要があります。Wordpressは送信元メールアドレスと照合して投稿ユーザの紐付けを行ない、紐付けが出来ない投稿は処理しません。

ただし、Wordpress側の投稿処理は標準では自動で行なわれません。投稿を反映させるためにはwp-mail.phpを手動実行するか、cronなどで自動実行する処理を自分で用意する必要があります。これがなかなか面倒です。

2.Ktai Entryを使う

「Ktai Entry」は標準機能の不備を補ってくれるプラグインです。投稿反映の自動実行、画像添付、独自記法によるカテゴリ指定などに対応しています。

事前準備

上記「標準機能を使う」の事前準備、設定を行ない、プラグイン「Ktai Entry」をインストールします。

設定

管理画面「設定」->「メールで投稿」で設定を行ないます。読み込み間隔、投稿受付メールアドレス(事前準備で作成したメールアドレスを入力する)、画像を添付した場合の配置位置、大きさ、テンプレート、管理者通知の有無などを設定できます。

投稿

標準機能を使った場合と同じく、設定した投稿用メールアドレス宛に、ユーザ情報で登録しているメールアドレスからメールを送信します。管理画面で設定した読み込み間隔に従って投稿が反映されます。

独自記法や高度な使い方についてはKtai Entryの公式ページを参照してください。

3.JetPackを使う

「Jetpack」はwordpress.com(WordpressのASPサービス)で提供されている機能をWordPressでも使えるようにするためのプラグインです。たくさんある機能の中にメール投稿も含まれています。

事前準備

Jetpackの機能を使うにはwordpress.comのアカウントを用意し、紐付け(連携)を行なう必要があります。あらかじめアカウントを用意してからプラグイン「JetPack」をインストールします。

インストールするとwordpress.comとの連携を促すボタンが表示されるので、これをクリックして連携を完了させてください。

設定

管理画面「ユーザー」->「あなたのプロフィール」に「メール投稿」という項目が追加されていますので、ここにある「メール投稿を有効化」ボタンをクリックします。クリックすると投稿用のメールアドレスが生成されます(例:xxxxxxxxxxx@post.wordpress.com)。

投稿

上記の設定で生成されたメールアドレス宛にメールを送信することで、Wordpressに記事が投稿されます。件名が記事タイトル、本文が記事本文となり、本文中にショートコードを記述することでカテゴリ、スラッグ、公開状態などの指定ができます。

このとき、送信元メールアドレスは識別されません。標準機能・Ktai Entryが送信元で投稿ユーザを判別するのに対して、JetPackは送信先メールアドレスをユーザ毎に生成することで投稿ユーザを認識します。そのため、運用次第ですが投稿用メールアドレスは秘密にしておく必要があるでしょう。

画像添付にも対応しており、HTMLメールの場合は文章中に挿入することも可能です。テキストメールの場合は本文の後ろに挿入され、複数枚添付している場合は標準機能の「ギャラリー」として表示されます(ショートコードが自動で付加されます)。

どの方法がよいのか

標準機能だけでは実用に耐えないのでKtai EntryかJetPackの2択になります。機能に大きな差はありませんが、一番大きな違いは投稿ユーザの識別方法だと思います。

Kati Entryは送信元で識別するので、基本的に(複数端末や送信元偽装を考えなければ)1投稿ユーザで投稿できるのは1人だけになります。JetPackは投稿用メールアドレスを知っていれば誰でも投稿することができるので、1投稿ユーザを複数人で運用する場合は便利です。

WordPressの管理画面などで使われている文言は、翻訳ファイル(poファイル)で定義されています。翻訳ファイルを修正するのは面倒ですが、functions.phpを使って、場当たり的ではありますが簡単に変更することもできます。

function my_gettext( $translated, $text, $domain ) {
    $custom_translates = array(
        'default' => array(
            'ニックネーム' => '名まえ',
            'プロフィール情報' => '自己紹介'
        )
    );
    if ( isset( $custom_translates[$domain] ) ) {
        $translated = str_replace( array_keys( $custom_translates[$domain] ), $custom_translates[$domain], $translated );
    }
    return $translated;
}
add_filter( 'gettext', 'my_gettext', 10, 3 );

詳しくはこちらをご参照ください。

WordPressで翻訳ファイルを修正せずにテキストを変更する方法
http://www.warna.info/archives/1581/

登録ユーザーのプロフィール項目は追加・削除することができます。
会員制サイトをつくるときなどに便利ですね。

function my_user_meta($hoge) {
    //不要な項目の削除
    unset($hoge['aim']);
    unset($hoge['jabber']);
    unset($hoge['yim']); 
    //項目の追加
    $hoge['user_sex'] = '性別';
    $hoge['user_blood'] = '血液型';
    return $hoge;
}
add_filter('user_contactmethods', 'my_user_meta', 10, 1);

WordPressの管理画面から指定できるパーマリンク設定は固定ページには適用されないので、functions.phpに以下のようなアクションを追加して設定します。

function my_init() {
	global $wp_rewrite;
	$wp_rewrite->page_structure = $wp_rewrite->root . '%pagename%.html';
	flush_rewrite_rules( false );
}
add_action( 'init', 'my_init' );

‘%pagename%.html’の部分を、管理画面から行なうパーマリンク設定と同じ書式で記述すればOKです。上記の例では、投稿スラッグの後ろに「.html」を追加してhtml風のURLに見せています。

「.html」を追加するだけであれば「.html on PAGES」などのプラグインがありますが、他のプラグインとコンフリクトを起こすことがあるので、シンプルな機能追加はなるべくfunctions.phpを使って、自分で簡潔に記述するのがよいと思います。

なお、

flush_rewrite_rules( false );

上記は本来パーマリンク設定を変更する際に一度だけ実行すればよい処理なので、コメントアウトしてアップし、管理画面>設定>パーマリンク設定で「変更を更新」ボタンを押すことで代用できます。

管理画面の見た目をカスタマイズしたい場合、テーマフォルダの中に新しくCSSファイルを用意して、管理画面から読み込まれるように設定するのがよいです。

functions.phpに以下を書き加えます。

function my_custom_admin_css(){
  wp_enqueue_style('my-admin', get_bloginfo('template_url') . '/my-admin.css');
}
add_action('admin_print_styles', 'my_custom_admin_css');

※「my_custom_admin_css」「my-admin.css」は任意の名前でOK。

公開されたサイトHTMLソースを見ると、ヘッダー部分に

<meta name="generator" content="WordPress x.x.x" />

のような表記があります。
WordPressを使っていることがバレないように、もしくは使用しているバージョンを判別されないようにするには、functions.phpに以下を書き加えます。

remove_action('wp_head', 'wp_generator');

ログイン時に最上部に表示される管理バーを非表示にする方法。
functions.phpに以下を加えます。

add_filter( 'show_admin_bar', '__return_false' );

ループまとめ

ワードプレスでのサイト構築はループに始まりループに終わると言っても過言ではありません。
というわけでループについて簡単にまとめておきます。

基本ループ

<?php if(have_posts()): while(have_posts()): the_post(); ?>
//ほげほげ
<?php endwhile; endif; ?>

普通のブログであれば、大抵はこれだけで済みます。
現在のページ(トップページ、カテゴリページなど)に適合した投稿内容を表示してくれます。

have_posts()
表示すべき投稿記事があれば「true」を返し、なければ「false」を返します。表示対象となる投稿記事はページに依存します。
the_post()
投稿情報を読み込み、その情報をカスタムタグ(the_contentなど)で使えるように準備します。

基本ループをカスタマイズ

基本ループで呼び出される投稿は、デフォルトではそのページ(トップページ、カテゴリページなど)に依存しますが、基本ループの直前にこのコードを記述すると投稿を呼び出す条件が変更されます。

<?php query_posts($query_string.'&posts_per_page=5&cat=1,3'); ?>

上記だと、カテゴリID1または3に属する投稿が5件毎に呼び出されます。

query_posts()
基本ループで呼び出す投稿の条件(デフォルトはページに依存)を指定する。
$query_string
主に現在の表示ページ数などを表わす文字列。ページナビゲーションを利用する場合などに必須なので、特に問題が無ければ最初から付けておくとよいです。

ただし、この方法は条件分岐タグ(is_home()、is_category()など)の動作に影響を与えるので注意が必要です。

マルチループ

自由に投稿一覧を表示させたい場合は以下のループを使用します。

<?php $myposts = get_posts('numberposts=5&category=1'); ?>
<?php foreach($myposts as $post): ?>
<?php setup_postdata($post); ?>
//ほげほげ
<?php endforeach; ?>
get_posts()
ページに関係なく任意の投稿記事を読み込み、その情報を使えるように準備する。対象となる投稿記事は引数で指定する。
setup_postdata()
投稿データをカスタムタグ(the_contentなど)経由で呼び出せるように準備する。基本ループの「the_post()」に相当。あるいはこれは使用せず、「<?php echo $post->ID; ?>」という風に投稿データを直接呼び出してもよいです。

細かい挙動については、また個別にエントリを書こうと思います。

カテゴリページにて、そのカテゴリの記事一覧を表示する方法。
特殊な状況下ではこのような方法も有効かと思います。

ポイントは「get_query_var(‘cat’)」で現在のカテゴリIDを取得できるところでしょうか。あまり知られていないような気がしますが、僕が知らなかっただけかもしれません。

<ul>
<?php
if (have_posts()) :
$cat_id = get_query_var('cat');
$query = 'cat=' . $cat_id. '&showposts=99';
query_posts($query) ;
while (have_posts()) : the_post();
?>
<li><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></li>
<?php endwhile; endif; ?>
</ul>