この記事はWordpress備忘録としての記事です。同じ悩みになった方には参考になるかもしれませんが、またハマる可能性があるので個人用メモです。
現象:URLを返すショートコードを自作しているときに、記事の上にリンクのされていない、URL文字列が意図なく表示される
以前もWordpressテーマを作っているときに同じ現象でハマり、何とか解決したのだけど、また同じ現象が…。しかし、どうやって解決したか忘れて、3時間以上ハマりました。
意図しないURLが投稿記事に表示されるときの回避方法
関連記事を
(xxxxはpost id)でカード表示、連続して表示する場合は、 と続けると複数個表示することができるショートコードです。
function post_related_thumbnail($atts, $content = null){
$content = do_shortcode($content);
$content .= '<div class="trawell-section trawell-layout-b2 trawell-related">';
$content .= '<div class="container">';
$content .= '<div class="row">';
if (!function_exists('is_countable')) {
function is_countable($atts) {
$counter = count($atts);
}
}else if (is_array($atts)) {
$counter = count($atts);
}
for ($i = 0; $i < $counter ; $i++) {
$p_id = $atts[$i];
$post = get_post($p_id);
$p_title = $post->post_title;
/*$url = the_permalink($post); */
$url = get_permalink($p_id);
$excerpt = wp_trim_words ( strip_shortcodes( $post->post_content ), 80 );
$trawell_featured_image = get_the_post_thumbnail($p_id, trawell_get_featured_image('trawell-b1-sid') );
$content .= '<div class="col-12 inline-related">';
$content .= '<article class="trawell-item row">';
if ($trawell_featured_image):
$content .= '<div class="col-5">';
$content .= '<a href="' . $url . '" class="entry-image">'.trawell_wp_kses( $trawell_featured_image).'</a>';
$content .= '</div>';
endif;
$content .= '<div class="col-7 no-left-padding">';
$content .= '<div class="entry-header">';
$content .= '<div class="entry-category color-text">'. trawell_get_category().'</div>';
$content .= '<h3 class="entry-title h4 sm-h6"><a href="' . $url . '">'.$p_title.'</a></h3>';
$content .= '<div class="entry-meta entry-meta-small">';
$content .= $excerpt;
$content .= '</div>';
$content .= '<p><a href="' . $url. '" class="green_link">この記事を読む</a></p>';
$content .= '</div>';
$content .= '</div>';
$content .= '</article>';
$content .= '</div>';
}
$content .= '</div>';
$content .= '</div>';
$content .= '</div>';
return $content;
}
add_shortcode('related', 'post_related_thumbnail');
add_filterなどで対処を試みたけど、意図する表示もされず、意図せず記事上部に現れるURLも消えない・・・・ということでハマったところ。
以下のコードを入力してみたら、いらんURLは表示さえなくなりました。
ob_start();
ob_get_clean();
ob_star()関数は、出力のバッファリングを有効にし、ob_get_clean()関数はバッファの内容を出力せずに消去してくれるものになるので、バッファにあるURLを消去してくれたのだろうか・・・
表示はされなくなったけど、一部URL取得方法に問題があることを発見。
/*$url = the_permalink($post); */
$url = get_permalink($p_id);
the_parmalink で取得していたURLを、get_parmalinkに変更したところ、予期しないURLは表示されなくなりました。
the permalinkのAPIにこのように記載されていました。
ループ の中で処理されている投稿の パーマリンク の URL を表示します。このタグは ループ 内で使用されなければならず、一般的に各投稿のパーマリンクを表示するときに利用します。このテンプレートタグは処理されている投稿のパーマリンクを表示するだけです。そのため、あなたのブログにある任意の投稿のパーマリンクを表示するために使用することは出来ません。もしもユニークな投稿 ID を与えて投稿のパーマリンクを取得したいのなら、get_permalink() を参照してください。
https://wpdocs.osdn.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/the_permalink
ふむふむ、なるほど。任意の記事のURLを含みreturnをして記事に表示するという関数だったのに、get_permalink()を使用していなかったことが原因だったようです。
ただ、echoなどで出力していないのに、記事の冒頭に表示されるのはなぜなのでしょうか。。ここを知っている方がいらっしゃったらコメントください。オネガイシマス。
コメント・質問する