Skip to content

Commit

Permalink
Merge pull request #1157 from vektor-inc/fix/custom-post-current
Browse files Browse the repository at this point in the history
[ Navigation Menu Custom ] カスタム投稿タイプで誤動作修正
  • Loading branch information
kurudrive authored Jan 11, 2025
2 parents 6c2574c + 768a13b commit 6ac9f06
Show file tree
Hide file tree
Showing 3 changed files with 266 additions and 60 deletions.
85 changes: 42 additions & 43 deletions composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

90 changes: 73 additions & 17 deletions inc/nav-menu-class-custom/class-nav-menu-class-custom.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ class VkNavMenuClassCustom {

public static function init() {
// Classic Navigation custom
add_filter( 'nav_menu_css_class', array( __CLASS__, 'add_current_class_to_classic_navi' ), 10, 2 );
add_filter( 'nav_menu_css_class', array( __CLASS__, 'classic_navi_class_custom' ), 10, 2 );
// Navigation Block custom
add_filter( 'render_block', array( __CLASS__, 'add_current_class_to_navigation_item_block' ), 10, 2 );
add_filter( 'render_block', array( __CLASS__, 'navigation_item_block_class_custom' ), 10, 2 );
}

/**
Expand All @@ -23,7 +23,7 @@ public static function init() {
* @param object $item : メニューオブジェクト
* @return array $classes : メニューのクラス配列
*/
public static function add_current_class_to_classic_navi( $classes, $item ) {
public static function classic_navi_class_custom( $classes, $item ) {
// 付与するカレントクラス名
$add_current_class_name = 'current-menu-ancestor';

Expand Down Expand Up @@ -58,24 +58,66 @@ public static function add_current_class_to_classic_navi( $classes, $item ) {
* @param array $block : ブロックの属性
* @return string : カレントクラスを追加したブロックのコンテンツ
*/
public static function add_current_class_to_navigation_item_block( $block_content, $block ) {
public static function navigation_item_block_class_custom( $block_content, $block ) {
// ナビゲーションアイテムブロックに対して処理を適用
if ( 'core/navigation-link' === $block['blockName'] || 'core/navigation-submenu' === $block['blockName'] ) {
if ( self::is_active_menu_item( $block['attrs']['url'] ) ) {
// $block_content の中の class=" 中に current-menu-item という文字列がない場合に current-menu-ancestor を追加する
if ( strpos( $block_content, 'current-menu-item' ) === false ) {
$block_content = preg_replace(
'/class="([^"]*)"/',
'class="$1 current-menu-item"',
$block_content,
1
);
// 固定ページの時の動作はもともと問題ないので、それ以外の場合のみ処理する
if ( ! is_page() ) {
if ( self::is_active_menu_item( $block['attrs']['url'] ) ) {
$block_content = self::class_name_custom( $block_content, 'current-menu-item', true );
} else {
// カスタム投稿タイプのページを表示していても、カレントクラスが付与されるので、
// アクティブでないと判断された項目に current クラスがあった場合は削除
$block_content = self::class_name_custom( $block_content, 'current-menu-ancestor', false );
}
}
}
return $block_content;
}

/**
* クラス名を改変する
*
* @param string $content : 対象文字列
* @param string $class_name : 追加・削除するクラス名
* @param bool $add : true の場合は $class_name を class= の中に追加する、false の場合は削除する
* @return string : クラス名を改変したコンテンツ
*/
public static function class_name_custom( $content, $class_name, $add = true ) {
if ( $add ) {
// $class_name が class= の中に存在しない場合にのみ追加
if ( strpos( $content, $class_name ) === false ) {
$content = preg_replace(
'/class="([^"]*)"/',
'class="$1 ' . $class_name . '"',
$content,
1
);
}
} else {
// $class_name が class= の中に存在する場合は削除
$content = preg_replace(
'/class="([^"]*)\b' . preg_quote( $class_name, '/' ) . '\b([^"]*)"/',
'class="$1$2"',
$content,
1
);
// 余分なスペースを削除
$content = preg_replace(
'/class="\s*([^"]*?)\s*"/',
'class="$1"',
$content
);
// 連続するスペースを1つにする
$content = preg_replace(
'/\s+/',
' ',
$content
);
}
return $content;
}

/**
* URLに ? を含んでいない場合に末尾に / を追加する
*/
Expand All @@ -93,6 +135,10 @@ public static function ensureTrailingSlash( $url ) {
/**
* Get post type from URL
*
* ヘッダーメニューのアクティブラベル用なので、トップメニューに入る項目として、
* 投稿トップ / カスタム投稿タイプのトップ の投稿タイプが検出できればよい
* (詳細ページの検出は不要)
*
* @param string $url : URL
* @return string : post type name
*/
Expand Down Expand Up @@ -129,7 +175,17 @@ public static function get_post_type_from_url( $url ) {
if ( isset( $matches[1] ) ) {
$menu_url_post_type = $matches[1];
} else {
$menu_url_post_type = '';
// home_url() . /?p=数字 の場合( "ドメイン/" と "?p=" の間には index.php は不要)は、その数字をget_postに渡して投稿タイプを取得する
$pattern = '/[?&]p=([^&]+)/';
$subject = $url;
preg_match( $pattern, $subject, $matches );
// マッチした場合
if ( $matches ) {
// 抽出した数字をget_postに渡して投稿タイプを取得する
$post_id = $matches[1];
$post_type = get_post_type( $post_id );
$menu_url_post_type = $post_type;
}
}// if ( isset( $matches[1] ) ) {
} else {

Expand Down Expand Up @@ -176,6 +232,9 @@ public static function get_post_type_from_url( $url ) {
public static function is_active_menu_item( $item_src ) {
$return = false;

// メニュー項目のリンク先のページの投稿タイプを取得
$menu_url_post_type = self::get_post_type_from_url( $item_src );

// 今表示しているページが属する投稿タイプを取得
if ( function_exists( 'vk_get_post_type' ) ) {
$displaying_page_post_type_info = vk_get_post_type();
Expand All @@ -198,9 +257,6 @@ public static function is_active_menu_item( $item_src ) {
}
}

// メニュー項目のリンク先のページの投稿タイプを取得
$menu_url_post_type = self::get_post_type_from_url( $item_src );

if ( ! empty( $menu_url_post_type ) && ! empty( $displaying_page_post_type_slug ) ) {
// 今表示しているページの投稿タイプとメニューに記入されているURLのページの投稿タイプが同じ場合
if ( $displaying_page_post_type_slug === $menu_url_post_type ) {
Expand Down
Loading

0 comments on commit 6ac9f06

Please sign in to comment.