Support » Themes » $lookup – Fehler beu PHP-Versionswechsel

  • Gelöst Lynnv

    (@lynnv)


    Hallo@all,

    weiß zufällig jemand, ob der lookup-Befehl in der neuen PHP-Version nicht mehr funktioniert ?

    Also bin dabei, die PHP-Version 7.4 in 8.3 zu ändern, dabei stürzt die Seite ab. Die Fehlermeldung sagt dann aus, dass Children nicht NULL sein darf.

    Wenn ich den unteren Code auskommentiere, funktioniert die Seite, allerdings funktioniert dann das Menü nicht mehr.

    LG sendet

    Lynn

    
    // Build hirarchy (page has children)
    
    foreach ($pages as $page) {
    
    $lookup[$page->ID]->parent = $lookup[intval($page->menu_item_parent)];
    $lookup[intval($page->menu_item_parent)]->children[] = $lookup[$page->ID];
    
    }
Ansicht von 7 Antworten - 1 bis 7 (von insgesamt 7)
  • Hallo,
    hilfreich könnte dabei die Aktivierung des Debug-Modus sein. Damit Fehler ausgelesen werden können, müssen die Fehler in eine Log-Datei auf dem Server geschrieben werden, auf die man dann per FTP (oder auch SSH) zugreifen kann.
    Sichere bitte zunächst die wp-config.php auf deinem lokalen Rechner.
    Gib dann bitte mit einem geeigneten Programmier-Editor (z. B. Notepad++) in der wp-config.php oberhalb von /* That's all, stop editing! Happy blogging. */ folgendes ein:

    define( 'WP_DEBUG', true );
    define( 'WP_DEBUG_DISPLAY', false);
    define( 'WP_DEBUG_LOG', true );

    Achte darauf, dass du define('WP_DEBUG', false); überschreibst, falls die Zeile bereits in der wp-config.php steht. Wenn versucht wird, diese Konstante ein zweites mal zu definieren, gibt es einen Fehler, der deine Seite lahmlegen würde.
    Mit diesen drei Codezeilen sagen wir WordPress, dass der Debug-Modus aktiviert werden soll. Die Fehlermeldungen sollen aber nicht direkt angezeigt werden, sondern in die Datei /wp-content/debug.log geschrieben werden.
    Wenn der Fehler gefunden wurde bzw. wenn die Fehler nicht mehr in die debug.log geschrieben werden sollen, dann musst du daran denken, die Variable
    define( 'WP_DEBUG_LOG', true );
    wieder auf false zu setzen:
    define( 'WP_DEBUG_LOG', false);

    Evtl. auch mal PHP zunächst auf 8.1.x oder 8.2.x umstellen.
    Ggfs. auch Info an die Entwickler des Themes und/oder Plugins.

    Viele Grüße
    Hans-Gerd

    Thread-Starter Lynnv

    (@lynnv)

    Hallo Gerd,

    schnell wie immer 😉

    Auch mit PHP 8.0 wird die Seite abgebrochen!

    Fatal error Uncaught Error: Attempt to modify property "children" on null in /homepages/7/d292804320/htdocs/WordPress/wp-content/themes/briegerthochgeschurtz/functions.php:169Stack trace:

    #0 /homepages/7/d292804320/htdocs/WordPress/wp-content/themes/briegerthochgeschurtz/modules/navigation.php(1): BH_Page::getTree()

    #1 /homepages/7/d292804320/htdocs/WordPress/wp-includes/template.php(792): require(‚/homepages/7/d2…‘)

    #2 /homepages/7/d292804320/htdocs/WordPress/wp-includes/template.php(725): load_template()

    #3 /homepages/7/d292804320/htdocs/WordPress/wp-includes/general-template.php(206): locate_template()

    #4 /homepages/7/d292804320/htdocs/WordPress/wp-content/themes/briegerthochgeschurtz/index.php(15): get_template_part()

    #5 /homepages/7/d292804320/htdocs/WordPress/wp-includes/template-loader.php(106): include(‚/homepages/7/d2…‘)

    #6 /homepages/7/d292804320/htdocs/WordPress/wp-blog-header.php(19): require_once(‚/homepages/7/d2…‘)

    #7 /homepages/7/d292804320/htdocs/WordPress/index.php(17): require(‚/homepages/7/d2…‘)

    #8 {main} thrown

    LG sendet

    Lynn

    $lookup ist überhaupt keine Funktion, sondern eine Variable, wobei der Entwickler einen wenig aussagefähigen Begriff verwendet hat. Nur anhand der zwei Zeilen Code lässt sich schwer zuordnen, was da eigentlich genau passieren soll. Die Fehlermeldung besagt aber, dass einem PHP-Objekt ein Wert zugewiesen werden soll, was nicht funktioniert. Der Programmierer hat auch keine Abfrage eingebaut, die erst einmal prüft, ob das Objekt überhaupt vorhanden ist. Während ältere PHP-Versionen solche Fehler einfach toleriert haben, wird bei PHP8 mit einer Fehlermeldung abgebrochen.
    Da das Theme nicht öffentlich zugänglich ist, können wir nicht viel mehr zu der Fehlermeldung sagen. Wende dich bitte an den Entwickler.

    Thread-Starter Lynnv

    (@lynnv)

    Hallo Bego Mario Garde,

    vielen Dank für Deine Ausführung zu PHP 8, dass dort anders gehändelt wird.

    Der Autor ist anscheinend nicht mehr greifbar 🙁
    Hier der gesamte Code, in 169 ist die Stelle, wo abgebrochen wird.

    <?php
    
    // Theme setup
    add_action( 'after_setup_theme', 'bh_setup' );
    
    function bh_setup() {
    	
    	// hide admin bar
    	add_filter( 'show_admin_bar', '__return_false' );
    
    	// remove some default header stuff (@see: wp-includes/default-filters.php)
    	remove_action( 'wp_head', 'feed_links',                      2     );
    	remove_action( 'wp_head', 'feed_links_extra',                3     );
    	remove_action( 'wp_head', 'rsd_link'                               );
    	remove_action( 'wp_head', 'wlwmanifest_link'                       );
    	remove_action( 'wp_head', 'wp_generator'                           );
    	remove_action( 'wp_head', 'rel_canonical'                          );
        remove_action( 'wp_head', 'rsd_link');
        remove_action( 'wp_head', 'index_rel_link');
        remove_action( 'wp_head', 'parent_post_rel_link', 10, 0);
        remove_action( 'wp_head', 'start_post_rel_link', 10, 0);
        remove_action( 'wp_head', 'wp_shortlink_wp_head', 10, 0);
        remove_action( 'wp_head', 'wp_shortlink_header', 10, 0);
        remove_action( 'wp_head', 'adjacent_posts_rel_link_wp_head', 10, 0);
    
    	// remove emoji stuff
    	remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
    	remove_action( 'wp_print_styles', 'print_emoji_styles' );
    
    	// Post thumbnails
    	add_theme_support( 'post-thumbnails' );
    	
    	// Add nav menu
    	register_nav_menu( 'primary', __( 'Primary Menu', 'briegerthochgeschurtz' ) );
    	register_nav_menu( 'secondary', __( 'Secondary Menu', 'briegerthochgeschurtz' ) );
    	
    	// Make the theme translation ready
    	load_theme_textdomain( 'briegerthochgeschurtz', get_template_directory() . '/languages' );
    
        // register styles
        wp_enqueue_style( 'bh', get_template_directory_uri() . '/css/all.css' );
        // remove theme css from wp-admin
        add_action( 'admin_init', 'remove_local_css' );
    	
    	// Register and enqueue Javascript files
    	// wp_enqueue_script( 'bh_jquery', get_template_directory_uri().'/javascript/jquery-3.1.1.min.js', array(), '', true );
        wp_enqueue_script( 'bh_custom', get_template_directory_uri().'/javascript/custom.js', array('jquery'), '', true );
    
        // remove xmlrpc
        add_filter( 'xmlrpc_enabled', '__return_false' );
        add_filter( 'wp_headers', 'bh_remove_x_pingback' );
    
        // enable woocommerce support
        add_theme_support( 'woocommerce' );
    }
    
    // remove xmlrpc
    function bh_remove_x_pingback( $headers ) {
       unset( $headers['X-Pingback'] );
       return $headers;
    }
    
    // remove css from wp-admin
    function remove_local_css() {
    	wp_deregister_style( 'bh' );
    }
    
    function bh_sidebar() {
    	register_sidebar( array(
    		'name' => __( 'Sidebar', 'briegerthochgeschurtz' ),
    		'id' => 'sidebar',
    		'description' => '',
    		'before_widget' => '<div class="sidebar-widget">',
    		'after_widget' => '</div>',
    		'before_title' => '<h2>',
    		'after_title' => '</h2>'
    		) 
    	);
    }
    add_action( 'widgets_init', 'bh_sidebar' );
    
    // add Events-Option Page
    if( function_exists('acf_add_options_page') ) {
      acf_add_options_page(array(
            'page_title'    => 'Events',
            'menu_title'    => 'Events',
            'menu_slug'     => 'events',
        ));
    }
    // add Events-Select for pages
    function acf_load_event_field_choices( $field ) {
        // reset choices
        $field['choices'] = array();
        // get events
        $choices = get_field('events', 'option');
        // loop through array and add to field 'choices'
        if( is_array($choices) ) { 
            $field['choices'][] = "";
            foreach( $choices as $choice ) {
                $field['choices'][ $choice['veranstaltung'] ] = $choice['veranstaltung'];
            }
        }
        return $field;
    }
    add_filter( 'acf/load_field/name=eventlink', 'acf_load_event_field_choices' );
    
    // Navigation stuff
    error_reporting(E_ERROR | E_PARSE);
    class BH_Page {
    
        protected $data = array();
        public $parent = null;
        public $children = array();
        public function __construct(array $data) {
            $this->data = array(
                'ID' => $data['ID'],
                'title' => $data['title'],
                'url' => $data['url'],
                'current' => $data['current'],
                'hidden' => (in_array('hidden', (array) $data['classes'])),
                'target' => ($data['target']) ? ' target="' . $data['target'] . '"' : '',
            );
        }
    
        public function __get($key) {
            return $this->data[$key];
        }
    
        public function __set($key, $value) {
            $this->data[$key] = $value;
        }
    
        public static function getTree($name) {
            $locations = get_nav_menu_locations();
    
            if (array_key_exists($name, $locations) === false) {
                return;
            }
    
            $pages = wp_get_nav_menu_items($locations[$name]);
    
            _wp_menu_item_classes_by_context($pages); /* Adds [current] => 1 property */
    
            /**
             * Tree
             *
             * i.e. $treeRoot->children[2]->children[1]->title
             */
            // Create tree root (imaginary node)
            $treeRoot = new BH_Page(array(
                'ID' => 0,
                'title' => '__TREE_ROOT__',
                'url' => '',
                'current' => false
            ));
    
            // Build lookup table
            $lookup = array(
                0 => $treeRoot
            );
    
            foreach ($pages as $page) {
                $lookup[$page->ID] = new BH_Page($page->to_array());
            }
    
            // Build hirarchy (page has children)
           foreach ($pages as $page) {
                $lookup[$page->ID]->parent = $lookup[intval($page->menu_item_parent)];
                $lookup[intval($page->menu_item_parent)]->children[] = $lookup[$page->ID];
            }
    
            // Mark rootline as active
            $active = $treeRoot->findActive();
            if ($active !== null) {
                $active->setRootlineActive();
            }
    
            // Return tree root
            return $treeRoot;
        }
    
        public function setRootlineActive() {
            if ($this->parent === null) {
                return;
            }
    
            $this->parent->current = true;
            $this->parent->setRootlineActive();
        }
    
        public function findActive() {
            foreach ($this->children as $child) {
                if ($child->current) {
                    return $child;
                }
    
                $return = $child->findActive();
    
                if ($return !== null) {
                    return $return;
                }
            }
    
            return null;
        }
    
    
        public function hasVisibleChildren() {
            foreach ($this->children as $child) {
                if ($child->hidden === false) {
                    return true;
                }
            }
    
            return false;
        }
    
    }
    
    
    ?>

    Der Autor ist anscheinend nicht mehr greifbar

    Schade. Dann solltest du dir einen Dienstleister suchen, der den Code analysiert und korrigiert. Für Anwendungssupport sprengt das den zeitlichen Rahmen (zumindest für mich – vielleicht hat da jemand anders mehr Zeit). – Der Fehler betrifft weder WordPress selbst, noch eines der im WordPress-Verzeichnis frei erhältlichen Themes und Plugins, sondern den Code eines benutzereigenen Themes, das wir hier nicht programmiert haben und für das wir auch keinen Support anbieten.

    Thread-Starter Lynnv

    (@lynnv)

    Ich danke Dir trotzdem 😉

    Einen schönen Sonntagabend

    Lynn

    Thread-Starter Lynnv

    (@lynnv)

    Die Lösung dank dem Hinweis von Bego Mario Garde:

    // Build hirarchy (page has children)
       foreach ($pages as $page) {
          $lookup[$page->ID]->parent = $lookup[intval($page->menu_item_parent)];
       if (is_null($lookup[$page->ID]->parent));
          else{   
              $lookup[intval($page->menu_item_parent)]->children[] = $lookup[$page->ID];
              }
        }
Ansicht von 7 Antworten - 1 bis 7 (von insgesamt 7)