• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

timber / timber / 5690593717

pending completion
5690593717

Pull #1617

github

web-flow
Merge f587ceffa into b563d274e
Pull Request #1617: 2.x

4433 of 4433 new or added lines in 57 files covered. (100.0%)

3931 of 4433 relevant lines covered (88.68%)

58.28 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

92.86
/src/Factory/MenuItemFactory.php
1
<?php
2

3
namespace Timber\Factory;
4

5
use Timber\CoreInterface;
6

7
use Timber\Menu;
8
use Timber\MenuItem;
9
use WP_Post;
10

11
/**
12
 * Internal API class for instantiating Menus
13
 */
14
class MenuItemFactory
15
{
16
    /**
17
     * Create a new MenuItem from a WP_Post or post id
18
     *
19
     * @param int|WP_Post $item
20
     * @param Menu $menu
21
     * @return MenuItem|null
22
     */
23
    public function from($item, Menu $menu): ?MenuItem
24
    {
25
        if (\is_numeric($item)) {
61✔
26
            $item = \get_post($item);
4✔
27
        }
28

29
        if (\is_object($item) && $item instanceof WP_Post) {
61✔
30
            return $this->build($item, $menu);
61✔
31
        }
32

33
        return null;
1✔
34
    }
35

36
    protected function build(WP_Post $item, Menu $menu): CoreInterface
37
    {
38
        $class = $this->get_menuitem_class($item, $menu);
61✔
39

40
        return $class::build($item, $menu);
61✔
41
    }
42

43
    protected function get_menuitem_class(WP_Post $item, Menu $menu): string
44
    {
45
        /**
46
         * Filters the class(es) used for different menu items.
47
         *
48
         * Read more about this in the documentation for [Menu Item Class Maps](https://timber.github.io/docs/v2/guides/class-maps/#the-menu-item-class-map).
49
         *
50
         * The default Menu Item Class Map will contain class names for locations that map to `Timber\MenuItem`.
51
         *
52
         * @since 2.0.0
53
         * @example
54
         * ```
55
         * add_filter( 'timber/menuitem/classmap', function( $classmap ) {
56
         *     $custom_classmap = [
57
         *         'primary'   => MenuItemFooter::class,
58
         *         'secondary' => MenuItemHeader::class,
59
         *     ];
60
         *
61
         *     return array_merge( $classmap, $custom_classmap );
62
         * } );
63
         * ```
64
         *
65
         * @param array $classmap The menu item class(es) to use. An associative array where the key is
66
         *                        the location and the value the name of the class to use for this
67
         *                        menu item or a callback that determines the class to use.
68
         */
69
        $classmap = \apply_filters('timber/menuitem/classmap', []);
61✔
70

71
        $class = $classmap[$menu->theme_location] ?? null;
61✔
72

73
        // If class is a callable, call it to get the actual class name
74
        if (\is_callable($class)) {
61✔
75
            $class = $class($item, $menu);
×
76
        }
77

78
        // Fallback on the default class
79
        $class = $class ?? MenuItem::class;
61✔
80

81
        /**
82
         * Filters the menu item class
83
         *
84
         * @since 2.0.0
85
         * @example
86
         * ```
87
         * add_filter( 'timber/menuitem/class', function( $class, $item, $menu ) {
88
         *     if ( $item->post_parent ) {
89
         *         return SubMenuItem::class;
90
         *     }
91
         *
92
         *     return MenuItem::class;
93
         * }, 10, 3 );
94
         * ```
95
         *
96
         * @param string $class The class to use.
97
         * @param WP_Post $item The menu item.
98
         * @param Menu $menu The menu object.
99
         */
100
        $class = \apply_filters('timber/menuitem/class', $class, $item, $menu);
61✔
101
        return $class;
61✔
102
    }
103
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc