• 解決済 momo-sophia

    (@momo-sophia)


    トップページで与えられるGETパラメタを、他のページにも引き継ぎたいと考えています。

    投稿ページへのリンクは、the_permalinkの後にテキストを追加することで対応できたのですが、固定ページへのリンクはwp_nav_menuでメニュー生成されているのですが、引数に指定することも出来ず、どのように対応してよいかわかりません。
    アドバイスお願いします。

15件の返信を表示中 - 1 - 15件目 (全22件中)
  • こんにちわ、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 する時は必ずエスケープするようにしてください。

    トピック投稿者 momo-sophia

    (@momo-sophia)

    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 にオリジナルの値を渡すとか…

    トピック投稿者 momo-sophia

    (@momo-sophia)

    現在、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、を追加することができますか?

    トピック投稿者 momo-sophia

    (@momo-sophia)

    この引数に、$cmsを追加して
    <?php wp_nav_menu(‘menu=header_menu&container=false&cms=$cms’); ?>

    function.phpのmy_wp_nav_menu()関数で
    urlに?cms=$cms、を追加することができますか?

    はい、可能です。
    値を渡す際はエスケープ処理はお忘れなきよう。

    トピック投稿者 momo-sophia

    (@momo-sophia)

    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 );
    トピック投稿者 momo-sophia

    (@momo-sophia)

    度々すみません。
    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です。

    エラーになる…との事ですが、これだけでは分かりませんので、エラー内容はどういったものですか?

    トピック投稿者 momo-sophia

    (@momo-sophia)

    ■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 ) ); ?>

    というコードで大丈夫かと思います。
    (※エラーがでたらすみません)

    トピック投稿者 momo-sophia

    (@momo-sophia)

    状況は同じです。
    wp_nav_menuの実行前までしか、表示されません。

    wp_nav_menuからmy_wp_nav_menuに引数をわたす?ところができてなくないですか??

    トピック投稿者 momo-sophia

    (@momo-sophia)

    状況は同じです。
    wp_nav_menuの実行前までしか、表示されません。

    wp_nav_menuからmy_wp_nav_menuに引数をわたす?ところができてなくないですか??

15件の返信を表示中 - 1 - 15件目 (全22件中)
  • トピック「リンク先にGETパラメタを引き継ぎたい」には新たに返信することはできません。