web-dev-qa-db-ja.com

ナビゲーションメニューページのリンクのhrefを変更するためのフィルタの使用

ナビゲーションメニューページのリンクのhrefを、親テーマのデフォルトからその相対ページに移動する方法を別のURLに変更する方法を探しています。たとえば、「Our Philosophy」ページにリンクしているメニューリンク「Our Philosophy」がありますが、それをtimecube.com(rip)に移動したいと考えています。

おそらくこれを達成するための簡単な方法は、フィルタ(nav_menu_link_attributes?)を使用することです。しかし、これを機能させるためにフィルタを使って頭を包むことはできませんでした。

次のようなものが必要だと思います。

function change_nav_url( $atts, $item ) {
    // modify $item href?
}
add_filter ( 'nav_menu_link_attributes', 'change_nav_url');

私の最初の考えは、私はどこかでこの関数を呼び出す必要があるでしょう - 多分 - apply_filters()で - そして手動でどこかから$atts$itemを取得してそれに渡す必要があるでしょう。しかし、それは問題を引き起こします - どうやってそれらを手に入れ、そして何から(メニューオブジェクト?)それを考えて、私がそれらを手動で取得する必要があるなら、私は実際にはフィルタ対プレーンな関数を使うことの意味を見ません、従って多分私はそれをプラグインフォルダに入れなければなりません。 $attsへのアクセスか何か? (それはうまくいきませんでした)。いずれにせよ、私は明らかに何かを理解していません。

私は私の初心者の無知に光をもたらすのを助けてくれてありがとう。

3
Aristoatle

あなたは正しい軌道に乗っていて、わずかなねじれはほとんどありません。

  1. $attsを修正して返す必要があります。最初の引数の後の引数はすべて情報提供のために提供されており、変更しないでください。
  2. あなたはadd_filter()にあなたが複数の引数を期待することを伝える必要があります。

いくつかのデバッグコードを含む例は、次の行に沿ったものになります。

add_filter( 'nav_menu_link_attributes', function ( $atts, $item, $args, $depth ) {

    var_dump( $atts, $item ); // a lot of stuff we can use

    var_dump( $atts['href'] ); // string(36) "http://dev.rarst.net/our-philosophy/"

    var_dump( get_the_title( $item->object_id ) ); // string(14) "Our Philosophy", note $item itself is NOT a page

    if ( get_the_title( $item->object_id ) === 'Our Philosophy' ) { // for example

        $atts['href'] = 'https://example.com/';
    }

    return $atts;
}, 10, 4 ); // 4 so we get all arguments
5
Rarst

これにより、特定のメニュー項目のURLを更新することができます。 OPの場合、「Link Title」は「Our Philosophy」に置き換えられます。

これはあなたの子供のテーマのfunctions.phpに置かれるでしょう

 function update_menu_link($items){

    //look through the menu for items with Label "Link Title"
        foreach($items as $item){

            if($item->title === "Link Title"){ // this is the link label your searching for
                $item->url = "http://newlink.com"; //this is the new link
            }
        }
        return $items;
    }

    add_filter('wp_nav_menu_objects', 'update_menu_link', 10,2);
1
dbmpls