web-dev-qa-db-fra.com

WordPress 4.4+ rompt l'extension Walker

J'ai mis à jour WordPress de la version 4.2.2 à la version 4.5.1. La fonctionnalité d'extension de la classe Walker a été cassée. L'extension Walker:

class ReturnWalker extends Walker{

public $db_fields = array( 'parent' => 'parent', 
                           'id' => 'term_id' );
public $show_all = FALSE;       

/*
*
*   @param array
*   @param object
*   @param int
*   @param
*   @return NULL
*/
public function start_el( &$output, $category, $depth = 0, $args = array(), $current_object_id = 0) {
    if( !is_array($output) )
        $output = array();

    $id = $this->db_fields['id'];
    $parent = $this->db_fields['parent'];

    if( $depth == 0 || (!$category->$parent) ){
        $output[$category->term_id] = $category;
    } else if( $depth > 0){
        $this->search( $output, $category->$parent, $category );
    }
}

/*
*
*   @param array
*   @param int 
*   @param object
*/
private function search( &$output, $key, $category){

    $id = $this->db_fields['id'];
    $parent = $this->db_fields['parent'];


    if( count($output) ){
        foreach( $output as $k => &$object){
            if( $k == $key ){
                $object->children[$category->term_id] = $category;
                return;
            } else if( isset($object->children[$key]) ){
                $this->search( $object->children, $category->$parent, $category );
            }
        }
    } else if( $this->show_all){
        $output[$category->$id] = $category;
    }
}

/*
*   sets the field names used for id and parent id
*   @param array(
*               'id' => string
*               'parent' => string
*          )
*   @return NULL
*/
public function setDbFields( array $db_fields){
    $this->db_fields = array_merge( $this->db_fields, $db_fields );
}
}

prend les catégories récupérées en utilisant "get_the_terms ()" et le transmet à la méthode walk:

$breadcrumbs = new ReturnWalker;
$category = get_the_terms( $post->ID, 'category' );
$struct = $breadcrumbs->walk( $category, 0 );

Après une observation attentive, j'ai remarqué que $ category est maintenant un tableau d'objets WP_Term et que la classe WP_Term est finale. Cela casse l'extension car elle dépendait de la possibilité d'ajouter la propriété "enfants", mais comme la classe n'est pas mutable, elle n'est plus possible.

Le produit final est que la fonctionnalité permet de créer des URL et des chemins de navigation basés sur la taxonomie personnalisée utilisée par la publication. Quelqu'un a-t-il de bonnes solutions à ce type de problème?

Mise à jour -
La création d'une classe imitant WP_Terms et la copie des objets renvoyés par get_the_terms () dans la classe * _Terms travaillée. La transmission des objets renvoyés lors de l'instanciation de ma classe frappe le constructeur et crée une copie des propriétés que je contrôle sans me soucier des modifications de code essentielles:

                $categoryTerms = get_the_terms( $post->ID, 'category' );

                foreach( $categoryTerms as $categoryTerm ){
                    $category[] = new MyTerm( $categoryTerm );
                }

                $breadcrumbs = new MyWalker;
                $struct = $breadcrumbs->walk( $category, 0, array());
5
Jon Krane

Mise à jour - La création d'une classe imitant WP_Terms et la copie des objets renvoyés par get_the_terms () dans la classe * _Terms ont fonctionné. La transmission des objets renvoyés lors de l'instanciation de ma classe frappe le constructeur et crée une copie des propriétés que je contrôle, sans me soucier des modifications de code essentielles:

            $categoryTerms = get_the_terms( $post->ID, 'category' );

            foreach( $categoryTerms as $categoryTerm ){
                $category[] = new MyTerm( $categoryTerm );
            }

            $breadcrumbs = new MyWalker;
            $struct = $breadcrumbs->walk( $category, 0, array());
0
Jon Krane

Votre solution initiale était un bidouillage et aucune surprise n’a échoué. En général, n’ajoutez jamais de méthodes/attributs à des objets pour lesquels vous ne contrôlez pas leur classe ni leur développement futur.

La bonne façon est de créer votre propre objet à transmettre au promeneur. Transmettez-lui l’objet catégorie lors de la construction et remplissez les champs de la même manière que l’objet catégorie ou écrivez-lui des fonctions d’accesseur (pour les points de piratage complets, utilisez _get() et _set();)). Concevez-le assez bien et votre code de marcheur n'aura pas à changer du tout, seulement l'initialisation.

3
Mark Kaplun