diff --git a/src/Integration/WpmlIntegration.php b/src/Integration/WpmlIntegration.php index 2d322f905..092264a0d 100644 --- a/src/Integration/WpmlIntegration.php +++ b/src/Integration/WpmlIntegration.php @@ -2,6 +2,9 @@ namespace Timber\Integration; +use WP_Post; +use WPML_LS_Menu_Item; + class WpmlIntegration implements IntegrationInterface { public function should_init(): bool @@ -15,6 +18,7 @@ public function init(): void add_filter('timber/url_helper/get_content_subdir/home_url', [$this, 'file_system_to_url'], 10, 1); add_filter('timber/url_helper/url_to_file_system/path', [$this, 'file_system_to_url'], 10, 1); add_filter('timber/menu/id_from_location', [$this, 'menu_object_id_filter'], 10, 1); + add_filter('timber/menu/item_objects', [$this, 'menu_item_objects_filter'], 10, 1); add_filter('timber/image_helper/_get_file_url/home_url', [$this, 'file_system_to_url'], 10, 1); } @@ -30,4 +34,12 @@ public function menu_object_id_filter($id) { return wpml_object_id_filter($id, 'nav_menu'); } + + public function menu_item_objects_filter(array $items) + { + return array_map( + fn ($item) => ($item instanceof WPML_LS_Menu_Item ? new WP_Post($item) : $item), + $items + ); + } } diff --git a/src/Menu.php b/src/Menu.php index ee0054416..228e73caf 100644 --- a/src/Menu.php +++ b/src/Menu.php @@ -205,6 +205,28 @@ public static function build(?WP_Term $menu, $args = []): ?self */ $sorted_menu_items = apply_filters('wp_nav_menu_objects', $sorted_menu_items, $args); + /** + * Filters the sorted list of menu item objects before creating the Menu object. + * + * @since 2.0.0 + * @example + * ``` + * add_filter( 'timber/menu/item_objects', function ( $items ) { + * return array_map(function ($item) { + * if ( is_object( $item ) && ! ( $item instanceof \WP_Post ) ) { + * return new \WP_Post( get_object_vars( $item ) ); + * } + * + * return $item; + * }, $items); + * } ); + * ``` + * + * @param array $item + * @param WP_Term $menu + */ + $sorted_menu_items = apply_filters('timber/menu/item_objects', $sorted_menu_items, $menu); + // Create Menu object $nav_menu = new static($menu, (array) $args); $nav_menu->sorted_menu_items = $sorted_menu_items; diff --git a/tests/test-timber-menu.php b/tests/test-timber-menu.php index 1af32947f..26b54fc9c 100644 --- a/tests/test-timber-menu.php +++ b/tests/test-timber-menu.php @@ -474,6 +474,28 @@ public function testMenuOptionsInNavMenuCssClassFilter() ]); } + public function testMenuItemsFilter() + { + $term = self::_createTestMenu(); + $menu_id = $term['term_id']; + + $filter = function (array $items, WP_Term $menu) { + return array_map(function ($item) { + $item->classes[] = "test_{$item->ID}"; + return $item; + }, $items); + }; + + $this->add_filter_temporarily('timber/menu/item_objects', $filter, 10, 2); + + $menu = Timber::get_menu($menu_id); + $items = $menu->get_items(); + + foreach ($items as $item) { + $this->assertContains("test_{$item->ID}", $item->classes); + } + } + public function testMenuItemIsTargetBlank() { $menu_arr = self::_createTestMenu();