WordPressのメニュー>カスタムリンクでURLを自由に指定できますが、絶対リンクだとローカル開発やドメイン移転などで後々修正作業が必要になるかと思います。
たいした手間ではありませんが、ショートコードを使って管理できるようにしておけば、より管理が楽になりますので、今回はテーマのfunctions.phpに追加する次の3点をご紹介します。
- 外観>メニュー>カスタムリンクでショートコードを使えるようにする
- サイト(ホーム)URLを返すショートコード[home]を作る
- 自動補完されるhttp://、またはhttps://の文字列を取り除く
目次
外観>メニュー>カスタムリンクでショートコードを使えるようにする
メニュー項目のアンカー要素からhref属性をフィルタリングするにはnav_menu_link_attributesを使用します。do_shortcodeは指定されたコンテンツからショートコードを探し、そのフックを使用してショートコードをフィルタリングします。
//カスタムリンクでショートコードを使えるようにする
add_filter('nav_menu_link_attributes', 'enable_link_shortcodes', 10, 3);
function enable_link_shortcodes($atts, $item, $args)
{
$atts['href'] = do_shortcode($atts['href']);
return $atts;
}
サイト(ホーム)URLを返すショートコード[home]を作る
add_shortcodeで新しい一意のショートコードを追加します。site_url()でサイトのホームURLを取得します。例)https://wpfun.net
//サイト(ホーム)URLを返すショートコード[home]を作る
add_shortcode('home', 'baseurl_shortcode');
function baseurl_shortcode($atts)
{
return site_url();
}
カスタムリンクで自動補完されるhttp://、またはhttps://の文字列を取り除く
カスタムリンクではhttpまたはhttpsから始まっていないURLをメニュー保存・更新の際に自動補完します。上記のショートコード[home]ではサイトのURLが返ってくるので、そのままだとhttps://https://wpfun.netのようにプロトコルが重複してしまいます。
これに対処するため、wp_update_nav_menu_itemを使って更新時に、menu-item-typeがcustom(カスタムリンク)で、menu-item-url(URL)にショートタグ[home]が存在する場合、str_replaceでhttp://またはhttps://を空に置き換えるようにします。
//自動補完されるhttp://、またはhttps://の文字列を取り除く
add_action('wp_update_nav_menu_item', 'remove_http_str', 10, 3);
function remove_http_str($menu_id, $menu_item_db_id, $args)
{
if ('custom' === $args['menu-item-type']) {
if (strpos($args['menu-item-url'], '[home]') !== false) {
update_post_meta($menu_item_db_id, '_menu_item_url', str_replace(array('http://', 'https://'), '', esc_url_raw($args['menu-item-url'])));
}
}
}