web-dev-qa-db-fra.com

La modification indirecte de la propriété surchargée WP_Post :: $ classes n'a aucun effet

Je travaille sur un thème enfant et, bien que tout fonctionne, les classes Walker_Nav_Menu et Walker causent beaucoup de problèmes. Mon thème parent remplace Walker_Nav_Menu comme ci-dessous:

if ( ! class_exists( 'Zen_Menu_Walker' ) ) {

class Zen_Menu_Walker extends Walker_Nav_Menu {

    public function display_element( $element, &$children_elements, $max_depth, $depth = 0, $args, &$output ) {
        $element->has_children = ! empty( $children_elements[ $element->ID ] );
        $element->classes[]    = ( $element->current || $element->current_item_ancestor ) ? 'active' : '';
        $element->classes[]    = ( $element->has_children && 1 !== $max_depth ) ? 'has-dropdown' : '';

        parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
    }

    public function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
        $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';

        $classes   = empty( $item->classes ) ? array() : (array) $item->classes;
        $classes[] = 'menu-item-' . $item->ID;

        $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item, $args, $depth ) );
        $class_names = $class_names ? ' class="' . esc_attr( $class_names ) . '"' : '';

        $id = apply_filters( 'nav_menu_item_id', 'menu-item-' . $item->ID, $item, $args, $depth );
        $id = $id ? ' id="' . esc_attr( $id ) . '"' : '';

        $output .= $indent . '<li' . $id . $class_names . '>';

        $atts           = array();
        $atts['title']  = ! empty( $item->attr_title ) ? $item->attr_title : '';
        $atts['target'] = ! empty( $item->target ) ? $item->target : '';
        $atts['rel']    = ! empty( $item->xfn ) ? $item->xfn : '';
        $atts['href']   = ! empty( $item->url ) ? $item->url : '';

        $atts = apply_filters( 'nav_menu_link_attributes', $atts, $item, $args, $depth );

        $attributes = '';
        foreach ( $atts as $attr => $value ) {
            if ( ! empty( $value ) ) {
                //$value = ( 'href' === $attr ) ? esc_url( $value ) : esc_attr( $value );
                $attributes .= ' ' . $attr . '="' . $value . '"';
            }
        }

        $item_output = $args->before;
        $item_output .= '<a' . $attributes . '>';
        /** This filter is documented in wp-includes/post-template.php */
        $item_output .= $args->link_before . apply_filters( 'the_title', $item->title, $item->ID ) . $args->link_after;
        $item_output .= '</a>';
        $item_output .= $args->after;

        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
    }

    public function start_lvl( &$output, $depth = 0, $args = array() ) {
        $output .= "\n<ul class=\"sub-menu dropdown\">\n";
    }

}
}

Cela fonctionne sans erreur fatale dans le thème parent. Mais dans le thème de l'enfant, cela produit une erreur fatale:

Notice: Indirect modification of overloaded property WP_Post::$classes has no effect in /srv/www/htdocs/wpsite/wp-content/themes/zen-theme/class.menu.php on line 45

Est-ce que quelques recherches surStackoverflowetGoogleet les seules références que j'ai trouvées étaient:

Un jour de buggy en effet ... J'utilise PHP 5.6 et d'après ce que j'ai lu:

"À partir de PHP 5.3.0, vous recevrez un avertissement indiquant que" le temps de passage des appels "est obsolète lorsque vous utilisez & in foo (& $ a) ;. Et à partir de PHP 5.4.0, le délai de référence des appels a été supprimé. Son utilisation entraîne une erreur fatale. "

Tout devine pourquoi cela se produit ...

2
anithegregorian

Si "la ligne 45" est celle qui commence par $element->classes[] dans votre méthode display_element, essayez quelque chose comme ceci:

public function display_element( $element, &$children_elements, $max_depth, $depth = 0, $args, &$output ) {
    $element->has_children = ! empty( $children_elements[ $element->ID ] );

    if ( ! isset( $element->classes ) ) {
        $element->classes = array();
    }

    $element->classes[]    = ( $element->current || $element->current_item_ancestor ) ? 'active' : '';
    $element->classes[]    = ( $element->has_children && 1 !== $max_depth ) ? 'has-dropdown' : '';        

    parent::display_element( $element, $children_elements, $max_depth, $depth, $args, $output );
}

Le problème peut être que la fonction display_element reçoit un élément dont la propriété classes n'est pas définie, auquel cas vous essayez de transférer des données vers un tableau qui n'est référencé nulle part, sauf pour cette instance uniquement.

EDIT: De plus, pourquoi utilisez-vous la fonction display_element quand vous pouvez insérer ces classes dans la fonction start_el qui est elle-même appelée par display_element avec cet élément qui lui est transmis?

1
webtoure