[contact-form-7 id="1781" title="ご意見・ご要望・お問い合せ"]

Technical note

[WordPress] 記事のタイトルのリンク先を指定する。

2014.05.02

WordPressで記事のタイトルは当然その記事にリンクされますが、例えば店舗や企業のサイトで新着やお知らせ一覧のタイトルリンクを別の場所に指定したい時があります。そんな時はカスタムフィールドを使って実現することが出来ます。

指定URL入力用のカスタムフィールドを設定する

まずは編集画面に指定URLを入力するためのカスタムフィールドを設定します。前に紹介した「[ WordPress ] 独自のカスタムフィールドを設定する」で編集画面にカスタムフィールドを追加する方法を紹介しましたが、今回も同じ方法で追加します。

次の条件でカスタムフィールドを作成します。

  • カスタムフィールドの名前      :指定URL
  • カスタムフィールドのID       :direct_link
  • カスタムフィールドを挿入する編集画面:投稿(post)

ソースは次の通り。

PHP
<?php
 add_action('admin_menu', 'add_direct_link');
 add_action('save_post', 'save_direct_link');

 function add_direct_link(){
  if(function_exists('add_direct_link')){
   add_meta_box('direct_link', '指定URL', 'insert_direct_link', 'post', 'normal', 'high');
  }
 }

 function insert_direct_link(){
  global $post;
  wp_nonce_field(wp_create_nonce(__FILE__), 'my_nonce');
  echo '<label class="hidden" for="direct_link">指定URL</label><input type="text" name="" size="60" value="'.esc_html(get_post_meta($post->ID, 'direct_link', true)).'" />';
  echo '<p>タイトルリンクのURLを入力します。</p>';
 }

 function save_direct_link($post_id){
  $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; }

  $data = $_POST['direct_link'];
	
  if(get_post_meta($post_id, 'direct_link') == ""){
   add_post_meta($post_id, 'direct_link', $data, true);
  }
  elseif($data != get_post_meta($post_id, 'direct_link', true)){
   update_post_meta($post_id, 'direct_link', $data);
  }
  elseif($data == ""){
   delete_post_meta($post_id, 'direct_link', get_post_meta($post_id, 'direct_link', true));
  }
 }
?>

編集画面を確認するとこのようにカスタムフィールドが表示されているはずです。

追加された指定URLのカスタムフィールド

記事のタイトル一覧を出力する

テンプレートのタイトル一覧を表示したい場所に次ののコードを記述します。カスタムフィールド「指定URL」が入力されているか否かで処理が変わります。ソースは記事一覧の出力のみですが、必要があればカテゴリーや日付も出力できるよう変更してみてください。

PHP
<ul>
  <?php if (have_posts()) : while (have_posts()) : the_post(); ?>
  <li>
    <?php $post_id = $post->ID; $direct_link = get_post_meta($post_id,'direct_link',true); ?>
    <?php if($direct_link) : ?> //カスタムフィールド「指定URL」に値があれば
    <a href="<?php echo $direct_link; ?>"><?php the_title(); ?></a>
    <?php else : ?>//カスタムフィールド「指定URL」に値がなければ
    <a href="<?php the_permalink() ?>"><?php the_title(); ?></a>
    <?php endif; ?>
  </li>
  <?php endwhile; ?>
  <?php else: ?>
  <p><?php _e('まだ投稿がありません。'); ?></p>
  <?php endif; ?>
</ul>

カスタムフィールド「指定URL」、つまり変数$direct_linkが入力されていれば指定されたURLを、空なら従来の記事のURL the_permalink()を出力します。

もしこのようなケースが出てきたら、参考にしてみてください。

そういえば、Wordpressの書籍で最近役に立った一冊。実際のサイト構築を順を追って詳しく説明されていておすすめです。