対策

WordPressの「お知らせ一覧」のタイトルに外部リンクを貼る方法

更新日:

2014-08-22_210834

備忘録です。

よくWordPressでも新着情報みたいな感じで上の図のような「お知らせ一覧」を作成すると思うんですよ。

コードとしては以下のような感じ。

<dl>
<?php $posts = get_posts('numberposts=5&category=1&order=desc'); ?>
<?php foreach($posts as $post): ?>
<dt><span><?php the_time('Y.m.d'); ?></span></dt>
<dd>
<a href="<?php the_permalink(); ?>" >
<?php the_title(); ?></a>
</dd>
<?php endforeach; ?>
</dl>

でも、コレだと当然タイトルをクリックすると個別ページに飛ぶのですがそうではなくて

「別の外部URL」に直接リンクを貼りたい

時もありますよね。
タイトルクリックしたらそのままYahooとか。

今回はそれの方法です。

functions.phpに以下を入力

//リンクアドレス追加のカスタムフィールド作成
add_action('admin_menu', 'add_linkurl');
add_action('save_post', 'save_linkurl');

function add_linkurl(){
     if(function_exists('add_linkurl')){
          add_meta_box('linkurl1', 'リンク先URL', 'insert_linkurl', 'post', 'normal', 'high');
     }
}

function insert_linkurl(){
     global $post;
     wp_nonce_field(wp_create_nonce(__FILE__), 'my_nonce');
     echo '<label class="hidden" for="linkurl">リンク先URL</label><input type="text" name="linkurl" size="60" value="'.esc_html(get_post_meta($post->ID, 'linkurl', true)).'" />';
     echo '<p>リンクしたいURLを入力します。</p>';
}

function save_linkurl($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['linkurl'];

     if(get_post_meta($post_id, 'linkurl') == ""){
          add_post_meta($post_id, 'linkurl', $data, true);
     }elseif($data != get_post_meta($post_id, 'linkurl', true)){
          update_post_meta($post_id, 'linkurl', $data);
     }elseif($data == ""){
          delete_post_meta($post_id, 'linkurl', get_post_meta($post_id, 'linkurl', true));
     }
}

カスタムフィールドで投稿画面に「リンクURLを入力する箇所」を作ります。

2014-08-22_211558

ここにリンク先を貼ります。

次に、出力するコードを変更します。

出力するページ

<dl>
<?php $posts = get_posts('numberposts=5&category=1&order=desc'); ?>
<?php foreach($posts as $post): ?>
 <dt><span><?php the_time('Y.m.d'); ?></span></dt>
 <dd>
<?php //リンク設定の有無で切り分け
$linknourl = get_post_meta( $post->ID, 'linkurl', true );
if ( !empty( $linknourl ) ) : ?>
<?php
//htmlを除去
$linknourl = htmlspecialchars($linknourl,ENT_QUOTES,'UTF-8');
?>
<a href="<?php echo $linknourl; ?>">
<?php else : ?>
<a href="<?php the_permalink(); ?>" >
<?php endif; ?>
<?php the_title(); ?></a>
<!-- /リンク設定の有無で切り分け -->
</dd>
<?php endforeach; ?>
</dl>

カスタムフィールドに値があれば、そのURLへリンクを貼るしそうじゃなきゃ個別ページに飛ぶよって感じです。

ついでに外部に飛ばす場合はページが空の場合が多いのでheaderに以下を記述して値がある場合はnoindexにしといた方が良いと思います。

header.php

<?php if (is_home()) : ?>
<!-- /リンク設定の有無でindex -->
<?php if (is_home()) : ?>
<?php else : ?>
     <?php
     global $wp_query;
     $postID = $wp_query->post->ID;
     ?>
     <?php
     $linknourl = get_post_meta( $post->ID, 'linkurl', true );
     if ( !empty( $linknourl ) ) : ?>
     <meta name="robots" content="noindex,follow">
     <?php else : ?>
     <?php endif; ?>
<?php endif; ?>

意外と使えるんじゃないかな。
知らないけど。

参考

[ WordPress ] 独自のカスタムフィールドを設定する

-対策