web-dev-qa-db-ja.com

特定のメニュー項目を置き換える

だから、私はカスタムコードを追加するために以下を使って特定のメニューをターゲットにする方法を理解しています。

<?php

wp_nav_menu(
 array(
  'menu' => 'Project Nav',
  // do not fall back to first non-empty menu
  'theme_location' => '__no_such_location',
  // do not fall back to wp_page_menu()
  'fallback_cb' => false
 )
 );

?>

私が持っている質問は以下の通りです。

"primary"というメニューがあるとしましょう。このメニューには、4つのメニュー項目があります(下の写真)。

enter image description here

その一つが「プロファイル」です。

Wordの「Profile」をWordの「Profile」ではなく、ユーザーのプロフィール写真を表示する次のコードに置き換えます。

    <?php global $my_profile; ?>
    <?php if (is_user_logged_in()) : ?>
    <div class="img" data-key="profile"><?php echo get_avatar( get_current_user_id(), 64 ); ?></div>
    <?php endif; ?>

したがって、最終結果は次のようになります。

enter image description here

では、メニュー項目のタイトルを具体的にターゲットにする方法はありますか。

編集:

だから、私は次のようなものを手に入れました、そしてそれがなぜうまくいかないのか私にはわかりません。

function nav_replace_wpse_189788($item_output, $item, $args) {
 //var_dump($item_output, $item);
 if( $args->theme_location == 'primary' ){
  return $items;

   if ('royal_profile_menu_title' == $item->title) {
    global $my_profile;

    if (is_user_logged_in()) { 
      return '<div class="img" data-key="profile">'.get_avatar( get_current_user_id(), 64 ).'</div>';
        }
    }
  }
   return $item_output;
 }
 add_filter('walker_nav_menu_start_el','nav_replace_wpse_189788',10,2);

これが私の論理です。まず「基本」メニューをターゲットにしてから、項目のタイトル「royal_profile_menu_title」を探してから、Wordのタイトルを出力に置き換えます

(私のメニューのタイトルは "royal_profile_menu_title"です:下の写真) enter image description here

どれか

1
steve Kim

これはwalker_nav_menu_start_elフィルタを使用することで比較的簡単に実行できます(PHPタグスパムはすべて不要です)。

function nav_replace_wpse_189788($item_output, $item) {
  //   var_dump($item_output, $item);
  if ('Profile' == $item->title) {
    global $my_profile; // no idea what this does?
    if (is_user_logged_in()) { 
      return '<div class="img" data-key="profile">'.get_avatar( get_current_user_id(), 64 ).'</div>';
    }
  }
  return $item_output;
}
add_filter('walker_nav_menu_start_el','nav_replace_wpse_189788',10,2);

注:returnではなく、文字列をechoに編集する必要がありました。 if条件式を微調整する必要があるかもしれません。 var_dump()のコメントを外して、何をしなければならないのかを確認します。

5
s_ha_dum

私はCSSの次善策をとるでしょう。メニュー管理では、CSSクラスをメニュー項目に追加することができます(フィールドが表示されていない場合は、[画面オプション]に表示されます)。たとえば、 "profile-link"です。

そして、あなたはあなたのテンプレートHEADセクションに次のようなものを追加することができます。

<?php
$avatar = get_avatar_url( get_current_user_id(), array('size' => 64) ); // from WP 4.2
$image_url = $avatar['url'];
?>

<style type="text/css">
.menu li.profile-link { background-image: url(<?php echo $image_url ?>); /* + another CSS*/  }
.menu li.profile-link span { display: none; }
</style>

そしてwp_nav_menu関数に'link_before' => '<span>', 'link_after' => '</span>'オプションを追加してください。

テストされていません、しかしそれは仕事をするべきです。

1
Marek