WordPress でプラグインを使わずに、カスタムフィールドを使って meta 要素の「description」と「keywords」を出力する。
以下を functions.php に記述すると、「キーワード:このページのキーワードを入力してください。…」というような独自のカスタムフィールドを追加できる。詳細は「編集画面に独自のカスタムフィールドの入力項目を追加する」、「特定のページにだけメタボックスを追加する」を参照。
function add_my_box() {
//固定ページ(page)にメタボックスを追加
add_meta_box('meta_info', 'ページ情報', 'meta_info_form', 'page', 'normal', 'high');
//カスタム投稿タイプ(works)にメタボックスを追加
add_meta_box('meta_info', 'ページ情報', 'meta_info_form', 'works', 'normal', 'high');
}
add_action('add_meta_boxes', 'add_my_box');
//メタボックス(カスタムフィールド)に表示する内容
function meta_info_form() {
global $post;
wp_nonce_field(wp_create_nonce(__FILE__), 'my_nonce');
?>
<div id="meta_info">
<p><label>キーワード:このページのキーワードを入力してください。複数記入する際には半角のカンマ(,)で区切ってください。<br />
<input type="text" name="meta_keywords" value="<?php echo esc_html(get_post_meta($post->ID, 'meta_keywords', true)); ?>" style="width:80%" />
</label></p>
</div>
<p><label>説明:このページの説明を入力してください。(60~120文字前後)<br />
<input type="text" name="meta_description" value="<?php echo esc_html(get_post_meta($post->ID, 'meta_description', true)); ?>" style="width:80%" />
</label></p>
<?php
}
//カスタムフィールド(メタボックス)に入力された内容の更新などの処理
function my_box_save($post_id) {
global $post;
$my_nonce = isset($_POST['my_nonce']) ? $_POST['my_nonce'] : null;
if(!wp_verify_nonce($my_nonce, wp_create_nonce(__FILE__))) {
return $post_id;
}
if(defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { return $post_id; }
if(!current_user_can('edit_post', $post->ID)) { return $post_id; }
if($_POST['post_type'] == 'works'){
update_post_meta($post->ID, 'meta_keywords', $_POST['meta_keywords']);
update_post_meta($post->ID, 'meta_description', $_POST['meta_description']);
}
if($_POST['post_type'] == 'page'){
update_post_meta($post->ID, 'meta_keywords', $_POST['meta_keywords']);
update_post_meta($post->ID, 'meta_description', $_POST['meta_description']);
}
}
add_action('save_post', 'my_box_save');
上記の記述で固定ページとカスタム投稿タイプのページでは「キーワード」と「説明」の値を入力できるようになったが、フロントページ、ブログのトップページやカスタム投稿タイプのカスタムタクソノミーのアーカイブページは個別のページを持たないため、編集画面からそれらの値を入力することはできない。
それらのページの「キーワード」と「説明」は head 要素内で直接記述する。
</title>// title 要素の後に記述
<?php if(is_front_page()): ?> //フロントページの場合
<meta name="description" content="フロントページの説明" />
<meta name="keywords" content="フロントページのキーワード" />
<?php elseif(is_page() || is_singular('works')): ?> //固定ページとカスタム投稿タイプの場合
<?php
//カスタムフィールドの値を取得
$meta_description = get_post_custom_values('meta_description', $post->ID);
$meta_keywords = get_post_custom_values('meta_keywords', $post->ID);
?>
<?php if($meta_description[0]): ?>//取得した値(配列の最初の要素)が空なければ出力
//出力する際は esc_attr でエスケープ処理をする(trim で前後のホワイトスペースを削除)
<meta name="description" content="<?php echo esc_attr(trim($meta_description[0])); ?>" />
<?php endif; ?>
<?php if($meta_keywords[0]): ?>//取得した値(配列の最初の要素)が空なければ出力
<meta name="keywords" content="<?php echo esc_attr(trim($meta_keywords[0])); ?>" />
<?php endif; ?>
<?php else: ?>
<?php if(is_home() && !is_front_page()): ?> //ブログのトップページの場合
<meta name="description" content="ブログのトップページの説明" />
<meta name="keywords" content="ブログのトップページのキーワード" />
<?php elseif(is_tax('works_cat', 'crystal')): ?> //カスタムタクソノミーのアーカイブページの場合
<meta name="description" content="カスタムタクソノミーのアーカイブページの説明" />
<meta name="keywords" content="カスタムタクソノミーのアーカイブページのキーワード" />
<?php endif; ?>
<?php endif; ?>