投稿のリンク先URLを任意のURLに変更できるプラグインについての備忘録。
この手のプラグインは「Page Links To」を使っていましたが、「VK Link Target Controller」というプラグインがあったので使ってみました。
タイトルにある、別ウィンドウで開くコードはページの最下部に書いてあります。
「Page Links To」と「VK Link Target Controller」の違い
両プラグインとも使い方はシンプルで、リンクを設定して別ウィンドウで開くかどうかにチェックを入れるだけですが、
2つのプラグインには1つだけ違いがあって、「VK Link Target Controller」には「File Link」ボタンというものがあります。
このボタンを押すとメディアライブラリが立ち上がって、アップロードしたファイルを選択できるという気の利いた機能となっています。
この機能が制作中のWEBサイトにピッタリだったので、さっそく導入しました。
「別ウィンドウで開く」が効かない
導入して動作確認を行ったのですが、「別ウィンドウで開く」にチェックを入れて何度試しても同じウィンドウで開いてしまうという現象が。
ネットで調べると「VK Link Target Controller」には以下のような注意点がありました。
※ 「別ウィンドウで開く」のチェックは、htmlで各投稿に id=”post-(投稿id)” が入っていないと同じウィンドウで開きます。
まさにこれが原因で別ウィンドウで開くことができませんでした。
ちなみに、公式の解決方法にあるようにid=”post-(投稿id)”を入れても解決できなかったので、別の解決方法を探ることにしました。
「別ウィンドウで開く」コード
解決方法を探るためにプラグインのコードを見てみると、「vk-ltc-target」というカスタムフィールドに別ウィンドウで開くかどうかの値を保持していることがわかりました。
1のときは別ウィンドウで開く、0のときは同じウィンドウで開く。
よって、以下のコードで無事に解決しました。
1 2 3 4 5 6 7 8 9 | <?php // 別ウィンドウで開くかのチェック if(get_post_meta(get_the_ID(), 'vk-ltc-target')) { $target = 'target="_blank"'; } else { $target = ''; } ?> <a href="<?php the_permalink(); ?>" <?php echo $target; ?>>リンク</a> |
PHP8.0での不具合対策
PHP8.0(プラグインのバージョンが1.7.2)環境下で、以下2つの不具合を見つけましたので、その対策方法を紹介します。
- VK Link Target Controllerの設定画面にて、どの投稿タイプにもチェックを付けていない状態で保存するとシステムエラーとなる。
- リダイレクト用URLに指定したリンクが正常に出力されず、意図したリンクに遷移できない。
プラグインファイル「vk-link-target-controller.php」を改修することで、2つの不具合が解消できましたので以下に修正内容を載せておきます。
※動作を保証するものではありませんので、修正は自己責任で行ってください。
※プラグインを更新すると変更内容が失われますので、ご注意ください。
vk-link-target-controller.phpファイルの場所
wp-content/plugins/vk-link-target-controller/vk-link-target-controller.php
※パスはWordPressのインストールフォルダからのパス
vk-link-target-controller.phpの修正差分
わかりにくいかもしれませんが、ファイルを掲載すると長くなってしまうので修正差分だけ載せます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 67c67 < add_filter( 'the_permalink', array( $this, 'rewrite_link' ) ); --- > add_filter( 'the_permalink', array( $this, 'rewrite_link_filter' ), 10, 2 ); 231c231 < $checked = ( 0 != $options_exist && in_array( $slug, $options_exist ) ) ? 'checked="checked"' : ''; --- > $checked = ( 0 != $options_exist && in_array( $slug, (array)$options_exist ) ) ? 'checked="checked"' : ''; 284c284 < if ( ! in_array( sanitize_title( $slug_to_test ), $post_type_slugs ) ) { --- > if ( ! in_array( sanitize_title( $slug_to_test ), (array)$post_type_slugs ) ) { 472a473,498 > * rewrite_link_filter function > * Wrapper function with the_permalink filter > * call rewrite_link for rewriting link > * > * @access public > * @param string $orig_link Original permalink URL. > * @param int|WP_Post $post Post ID, WP_Post object, or 0. Default 0. > * @return string > */ > function rewrite_link_filter( $orig_link, $post = 0 ) { > $modified_url = ''; // No need to esc_url(), it's done in rewrite_link(). > if ( isset( $post->ID ) ) { > $modified_url = $this->rewrite_link( $post->ID ); > } elseif ( is_numeric( $post ) ) { > $modified_url = $this->rewrite_link( $post ); > } > > if( empty( $modified_url ) ) { > // Rewrite failed ? Invalid $post ? > // Back to $orig_link > $modified_url = $orig_link; > } > return $modified_url; > } > > /** 577c603 < if ( in_array( $current_post->post_type, $candidates ) ) { --- > if ( in_array( $current_post->post_type, (array)$candidates ) ) { |
参考URL
https://github.com/vektor-inc/vk-link-target-controller/issues/62