Skip to content

Commit

Permalink
Merge pull request #2705 from mcaskill/2.x-fix-wpml-menu-item
Browse files Browse the repository at this point in the history
  • Loading branch information
gchtr committed Mar 6, 2023
2 parents 8e4796a + de70e0b commit 325954c
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 0 deletions.
12 changes: 12 additions & 0 deletions src/Integration/WpmlIntegration.php
Expand Up @@ -2,6 +2,9 @@

namespace Timber\Integration;

use WP_Post;
use WPML_LS_Menu_Item;

class WpmlIntegration implements IntegrationInterface
{
public function should_init(): bool
Expand All @@ -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);
}

Expand All @@ -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
);
}
}
22 changes: 22 additions & 0 deletions src/Menu.php
Expand Up @@ -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<mixed> $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;
Expand Down
22 changes: 22 additions & 0 deletions tests/test-timber-menu.php
Expand Up @@ -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();
Expand Down

0 comments on commit 325954c

Please sign in to comment.