WordPress : Comment remplacer cette fonction de thème dans le thème enfant

Publié par Jean-Michel le

Je travaille dans un thème enfant et j’ai besoin de remplacer une fonction afin de supprimer certains éléments indésirables d’un menu supérieur. J’ai donc fait un peu de recherche et trouvé beaucoup de docs, vraiment, comme ça, ça et ça entre autres mais toujours pas clair du tout pour moi comment y parvenir sur mon cas spécifique. J’espère donc que quelqu’un ici pourra m’orienter sur la bonne direction. J’ai ces fonctions dans le functions.phpfichier de thème d’origine :

function udesign_nav() {
    if ( function_exists( 'wp_nav_menu' ) ) {
        $defaults = array(
            'container_class' => 'navigation-menu',
            'container_id' => 'navigation-menu',
            'menu_id'    => 'main-top-menu',
            'menu_class' => 'sf-menu',
            'link_before'=> '<span>',
            'link_after' => '</span>',
            'theme_location' => 'primary',
            'fallback_cb' => 'udesign_nav_fallback'
        );
        wp_nav_menu( $defaults );
    } else {
        udesign_nav_fallback();
    }
}

function udesign_nav_fallback() {
    $menu_html = '<div id="navigation-menu" class="navigation-menu">';
    $menu_html .= '<ul id="main-top-menu" class="sf-menu">';
    $menu_html .= is_front_page() ? "<li class='current_page_item'>" : "<li>";
    $menu_html .= '<a href="'.home_url().'"><span>'.esc_html__('Home', 'udesign').'</span></a></li>';
    $menu_html .= wp_list_pages('depth=5&title_li=0&sort_column=menu_order&link_before=<span>&link_after=</span>&echo=0');
    $menu_html .= '</ul>';
    $menu_html .= '</div>';
    echo $menu_html;
}

Et ça s’appelle, je crois, ici :

// Setup the main menu
function udesign_top_main_menu() {
    ob_start(); ?>
            <div class="clear"></div>
            <div id="main-menu">
                <div id="dropdown-holder" class="container_24">
<?php               udesign_nav(); // this function calls the main menu ?>
                </div>
                <!-- end dropdown-holder -->
            </div>
            <!-- end top-main-menu -->
<?php
    $main_menu_html = ob_get_clean();
    echo apply_filters( 'udesign_get_top_main_menu', $main_menu_html );
}
add_action('udesign_top_wrapper_bottom', 'udesign_top_main_menu', 10);

Ce que j’ai besoin de remplacer, c’est simplement de supprimer ces deux lignes de udesign_nav_fallback()la fonction :

$menu_html .= is_front_page() ? "<li class='current_page_item'>" : "<li>";
$menu_html .= '<a href="'.home_url().'"><span>'.esc_html__('Home', 'udesign').'</span></a></li>';

Que dois-je faire pour y parvenir en utilisant le functions.phpthème enfant?

Solution n°1 trouvée

Vous ne pouvez pas remplacer la ou les fonctions. Ils ne sont pas destinés à être écrasés. Voir : « Remplacer la fonction du thème parent qui n’est pas accrochée ou dans le fichier functions.php » et « Est-il possible de désactiver une fonction d’un thème parent ? ». C’est la réponse directe à votre question.

Cependant, vous pouvez presque certainement obtenir le résultat souhaité en utilisant le filtre fourni par le thème udesign_get_top_main_menu— — ou n’importe quel nombre de filtres fournis par wp_nav_menu()ou par la Walker_Nav_menuclasse — peut -être wp_nav_menu_objectsou wp_nav_menu_items.

Selon la question, vous souhaitez supprimer :

$menu_html .= is_front_page() ? "<li class='current_page_item'>" : "<li>";
$menu_html .= '<a href="'.home_url().'"><span>'.esc_html__('Home', 'udesign').'</span></a></li>';

D’accord. Vous devez probablement utiliser le filtre fourni dans le code posté :

function udesign_strip($menu) {
  var_dump($menu);
  $menu_html = is_front_page() ? "<li class='current_page_item'>" : "<li>";
  $menu_html .= '<a href="'.home_url().'"><span>'.esc_html__('Home', 'udesign').'</span></a></li>';
  $menu = str_replace($menu_html,'',$menu);
  return $menu;
}
add_filter('udesign_get_top_main_menu','udesign_strip');

Je n’aime pas str_replacele balisage mais c’est probablement la meilleure façon dans ce cas.

Catégories : Wordpress

0 commentaire

Laisser un commentaire

Avatar placeholder

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *