Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 71
0.00% covered (danger)
0.00%
0 / 2
CRAP
n/a
0 / 0
Automattic\Jetpack\Jetpack_Mu_Wpcom\Wpcom_Legacy_FSE\render_navigation_menu_block
0.00% covered (danger)
0.00%
0 / 58
0.00% covered (danger)
0.00%
0 / 1
156
Automattic\Jetpack\Jetpack_Mu_Wpcom\Wpcom_Legacy_FSE\get_fallback_navigation_menu
0.00% covered (danger)
0.00%
0 / 13
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2/**
3 * Render navigation menu block file.
4 *
5 * @package automattic/jetpack-mu-wpcom
6 */
7
8namespace Automattic\Jetpack\Jetpack_Mu_Wpcom\Wpcom_Legacy_FSE;
9
10use Automattic\Jetpack\Jetpack_Mu_Wpcom\Common;
11
12/**
13 * Render the navigation menu.
14 *
15 * @param array $attributes Block attributes.
16 * @return string
17 */
18function render_navigation_menu_block( $attributes ) {
19    Common\wpcom_record_tracks_event( 'wpcom_legacy_fse_render_block', array( 'block_name' => 'a8c/navigation-menu' ) );
20
21    $styles = '';
22
23    $container_class = 'menu-primary-container';
24    $toggle_class    = 'button';
25    if ( isset( $attributes['className'] ) ) {
26        $container_class .= ' ' . $attributes['className'];
27        $toggle_class    .= ' ' . $attributes['className'];
28    }
29
30    $align = ' alignwide';
31    if ( isset( $attributes['align'] ) ) {
32        $align = empty( $attributes['align'] ) ? '' : ' align' . $attributes['align'];
33    }
34    $class = $align;
35
36    if ( isset( $attributes['textAlign'] ) ) {
37        $class .= ' has-text-align-' . $attributes['textAlign'];
38    } else {
39        $class .= ' has-text-align-center';
40    }
41
42    if ( isset( $attributes['textColor'] ) ) {
43        $class .= ' has-text-color';
44        $class .= ' has-' . $attributes['textColor'] . '-color';
45    } elseif ( isset( $attributes['customTextColor'] ) ) {
46        $class  .= ' has-text-color';
47        $styles .= ' color: ' . $attributes['customTextColor'] . ';';
48    }
49
50    if ( isset( $attributes['backgroundColor'] ) ) {
51        $class .= ' has-background';
52        $class .= ' has-' . $attributes['backgroundColor'] . '-background-color';
53    } elseif ( isset( $attributes['customBackgroundColor'] ) ) {
54        $class  .= ' has-background';
55        $styles .= ' background-color: ' . $attributes['customBackgroundColor'] . ';';
56    }
57
58    if ( isset( $attributes['customFontSize'] ) ) {
59        $styles .= ' font-size: ' . $attributes['customFontSize'] . 'px;';
60    } elseif ( isset( $attributes['fontSize'] ) ) {
61        $class .= ' has-' . $attributes['fontSize'] . '-font-size';
62    } else {
63        $class .= ' has-small-font-size';
64    }
65
66    $container_class .= $class;
67    $toggle_class    .= $class;
68
69    $menu = wp_nav_menu(
70        array(
71            'echo'           => false,
72            'fallback_cb'    => 'get_fallback_navigation_menu',
73            'items_wrap'     => '<ul id="%1$s" class="%2$s" aria-label="submenu">%3$s</ul>',
74            'menu_class'     => 'main-menu footer-menu',
75            'theme_location' => 'menu-1',
76            'container'      => '',
77        )
78    );
79
80    ob_start();
81    // phpcs:disable WordPress.Security.EscapeOutput.OutputNotEscaped
82    ?>
83    <nav class="main-navigation wp-block-a8c-navigation-menu<?php echo esc_attr( $align ); ?>">
84        <input type="checkbox" role="button" aria-haspopup="true" id="toggle" class="hide-visually">
85        <label for="toggle" id="toggle-menu" class="<?php echo esc_attr( $toggle_class ); ?>" style="<?php echo esc_attr( $styles ); ?>">
86            <?php esc_html_e( 'Menu', 'jetpack-mu-wpcom' ); ?>
87            <span class="dropdown-icon open">+</span>
88            <span class="dropdown-icon close">&times;</span>
89            <span class="hide-visually expanded-text"><?php esc_html_e( 'expanded', 'jetpack-mu-wpcom' ); ?></span>
90            <span class="hide-visually collapsed-text"><?php esc_html_e( 'collapsed', 'jetpack-mu-wpcom' ); ?></span>
91        </label>
92        <div class="<?php echo esc_attr( $container_class ); ?>" style="<?php echo esc_attr( $styles ); ?>">
93            <?php echo $menu ? $menu : get_fallback_navigation_menu(); ?>
94        </div>
95    </nav>
96    <!-- #site-navigation -->
97    <?php
98    // phpcs:enable WordPress.Security.EscapeOutput.OutputNotEscaped
99    return ob_get_clean();
100}
101
102/**
103 * Render a list of all site pages as a fallback
104 * for when a menu does not exist.
105 *
106 * @return string
107 */
108function get_fallback_navigation_menu() {
109    $menu = wp_page_menu(
110        array(
111            'after'       => false,
112            'before'      => false,
113            'container'   => 'ul',
114            'echo'        => false,
115            'menu_class'  => 'main-menu footer-menu',
116            'sort_column' => 'menu_order, post_date',
117        )
118    );
119
120    /**
121     * Filter the fallback page menu to use the same
122     * CSS class structure as a regularly built menu
123     * so we don't have to duplicate CSS selectors everywhere.
124     */
125    $original_classes    = array( 'children', 'page_item_has_sub-menu' );
126    $replacement_classes = array( 'sub-menu', 'menu-item-has-children' );
127
128    return str_replace( $original_classes, $replacement_classes, $menu );
129}