リンク先にGETパラメタを引き継ぎたい
-
トップページで与えられるGETパラメタを、他のページにも引き継ぎたいと考えています。
投稿ページへのリンクは、the_permalinkの後にテキストを追加することで対応できたのですが、固定ページへのリンクはwp_nav_menuでメニュー生成されているのですが、引数に指定することも出来ず、どのように対応してよいかわかりません。
アドバイスお願いします。
-
こんにちわ、momo-sophiaさん。
wp_nav_menuのURLを全部手入力にしちゃうのが一番簡単だとは思います。
メニュー設定の所にリンクというのがあるので、それを使うと任意のURLが入れられます。
あとは、メニュー全部に同じURLパラメーターということでしたら以下のソースコードで可能です。以下をご使用のfunctions.phpに追加してください。
※例としてcmsというURLパラメーターを付与するコードです。function my_query_vars( $vars ) { $array = array( 'cms' ); return array_merge( $array, $vars ); } add_filter( 'query_vars', 'my_query_vars' ); function my_wp_nav_menu( $output, $args ) { return preg_replace('/href="(.*?)"/', 'href="' . add_query_arg( array( 'cms' => 'wordpress' ), '$1' ) . '"', $output); } add_filter( 'wp_nav_menu', 'my_wp_nav_menu', 10, 2 );
簡単に説明しますと、my_query_vars() 関数では WordPress で URL パラメーターを使えるように任意の URL パラメーターを追加しています。今回の例ですと cms になります。複数追加したい場合は、array( ‘hoge’, ‘fuga’ ) のようにしていただければいいです。
my_wp_nav_menu() 関数では、wp_nav_menu() 関数で出力される HTML を書き換えています。今回の例ですと、cms というパラメーターに wordpress という値を渡しています。複数追加したい場合は、array( ‘hoge’ => ‘hogehoge’, ‘fuga’ => ‘fugafuga’, ) としていただければいいです。
URLパラメーターの値を取得する場合は、テーマ内で get_query_var( ‘cms’ ) としていただければ cms についた値を取得する事ができます。$cms = get_query_var( 'cms' ); echo esc_html( $cms );
こんな感じです。値を echo する時は必ずエスケープするようにしてください。
KUCKLU様
回答ありがとうございます。
↑私の理解がまちがっていたら申し訳ないのですが。>メニュー全部に同じURLパラメーターということでしたら以下のソースコードで可能です
メニュー全部に同じパラメタを付加したいのですが、パラメタの中身は毎回かわるのです。
そのため、メニュー設定のリンクは使用できず、header.phpの中でパラメタの中身を取得して、固定ページへのリンクにセットしていました。cmsというパラメタの場合
//GETパラメタ取得 $cms= $_GET['cms'] $url = "?cms=$cms"; //メニュー <a href="http://~ <?php echo $url; ?>">固定ページ</a></li>
試していない且つ仕様が分からないので、明確なお答えはできないのですが…
my_wp_nav_menu() 関数を改造すればいけると思います。
$args にオリジナルの値を渡すとか…現在、header.phpで、以下の記述でメニューを呼び出しています。
<?php wp_nav_menu(‘menu=header_menu&container=false’); ?>この引数に、$cmsを追加して
<?php wp_nav_menu(‘menu=header_menu&container=false&cms=$cms’); ?>function.phpのmy_wp_nav_menu()関数で
urlに?cms=$cms、を追加することができますか?この引数に、$cmsを追加して
<?php wp_nav_menu(‘menu=header_menu&container=false&cms=$cms’); ?>function.phpのmy_wp_nav_menu()関数で
urlに?cms=$cms、を追加することができますか?はい、可能です。
値を渡す際はエスケープ処理はお忘れなきよう。KUCKLU様
あまりPHPに詳しくないので、続けてお力かしてください。
header.php
<?php wp_nav_menu(‘menu=header_menu&container=false&cms=$cms’); ?>
と指定して、function my_wp_nav_menu( $output, $args )での扱いが分かりません。
return preg_replace(‘/href=”(.*?)”/’, ‘href=”‘ . $args. ‘”‘, $output);
とすると、現在のURLを指すようになりました。$argsの中に、$cmsの値も入っているわけではないのですね?
変数の中に何が入っているのか分からない時は、var_dump() というPHPの関数をを使用してみてください。そうすると、変数の中に何が入っているのかが分かります。
今回の場合、$output には出力されるHTML、$args の中には wp_nav_menu で渡している引数が配列になって入っています。その為、$args を直接 echo しても特に何もなりません。
サンプルは以下の感じです。function my_wp_nav_menu( $output, $args ) { if( ! isset( $args['cms'] ) ) return $output; $param = esc_attr( $args['cms'] ); return preg_replace('/href="(.*?)"/', 'href="' . add_query_arg( array( 'cms' => $param ), '$1' ) . '"', $output); } add_filter( 'wp_nav_menu', 'my_wp_nav_menu', 10, 2 );
度々すみません。
add_filter( ‘wp_nav_menu’, ‘my_wp_nav_menu’, 10, 2 );
を指定すると、何かがエラーになるのか、ページが表示できなくなります。add_filter( ‘wp_nav_menu’, ‘my_wp_nav_menu’, 10, 1 );
だと、正常に表示されるのですが、$argsの中身はNULLです。
フックした関数が、引数を受け取れていないということなのでしょうか。。別アプローチ:html の下の方に Javascript を書くだけ。
!function($){ $('a').on('click', function(){ var q = document.location.search.substring(1) , h = $(this).attr('href') , g = -1 === h.indexOf('?') ? '?' : '&'; if(-1 !== q.indexOf('cms=')){ h = [h, q].join(g); } document.location.href = h; return false; }); }(window.jQuery);
add_filter( ‘wp_nav_menu’, ‘my_wp_nav_menu’, 10, 1 );
だと、正常に表示されるのですが、$argsの中身はNULLです。それはそうです。add_filter の最後の引数は関数に渡す引数の数になります。
add_filter( 'wp_nav_menu', 'my_wp_nav_menu', 10, 1 );
の場合、渡す引数は1つとなり、$output しか渡していません。なので、$args の中身はNULLです。エラーになる…との事ですが、これだけでは分かりませんので、エラー内容はどういったものですか?
■Pimp My Site様
ありがとうございます。
でも、Javascriptが全くわからないので、カスタマイズできません。■KUCKLU様
ページが途中までしか表示されなくなります。2にした場合の引数は、
<?php wp_nav_menu('menu=header_menu&container=false&cms=$cms'); ?>
のmenu=header_menu&container=false&cms=$cmsですか?
wp_nav_menuにも修正を加えないと、引数を渡してあげることができないように感じるのですが?
見当違いなことを言っていたら、申し訳ありません。エラー詳細を知るやり方をご存知でしたら教えてください。
momo-sophia さん、こんにちわ。
wp_nav_menuにも修正を加えないと、引数を渡してあげることができないように感じるのですが?
はい、少し書き方を変えてあげる必要があります。
<?php wp_nav_menu('menu=header_menu&container=false&cms=$cms'); ?>
これだと、$cms がそのまま渡ってしまいます。なので…
<?php wp_nav_menu( 'menu=header_menu&container=false&cms=' . $cms ); ?>
<?php wp_nav_menu( array( 'menu' => 'header_menu', 'container' => false, 'cms' => $cms ) ); ?>
というコードで大丈夫かと思います。
(※エラーがでたらすみません)状況は同じです。
wp_nav_menuの実行前までしか、表示されません。wp_nav_menuからmy_wp_nav_menuに引数をわたす?ところができてなくないですか??
状況は同じです。
wp_nav_menuの実行前までしか、表示されません。wp_nav_menuからmy_wp_nav_menuに引数をわたす?ところができてなくないですか??
- トピック「リンク先にGETパラメタを引き継ぎたい」には新たに返信することはできません。