Un utilisateur a demandé 👇

Pourquoi $wpdb renvoie-t-il une valeur nulle globale dans ce code ? Je ne peux pas faire la requête mysql car le monde est nul. Ci-dessous l’erreur dans le fichier journal des erreurs :

Erreur fatale PHP : erreur non détectée : appel à la fonction member() null null

public static function get_classifieds( $urls ) {

        global $wpdb;

        $dom_document = new DOMDocument();

        foreach($urls as $url) {

            if( ! function_exists( 'wp_remote_request' ) ) {

                $html = file_get_contents( $url );
                $dom_document->loadHTML( $html );

            } else {

                $response = wp_remote_request( $url );            
                $body = wp_remote_retrieve_body( $response ); 
                $dom_document->loadHTML( $body );

            } 

            $li_elements = $dom_document->getElementsByTagName( 'li' );

            foreach( $li_elements as $li_element ) {

                $pattern = '/itemsresult/';
                $class = $li_element->getAttribute( 'class' );

                if( preg_match( $pattern, $class ) ) {

                    $img_elements = $li_element->getElementsByTagName( 'img' );
                    $h3_elements = $li_element->getElementsByTagName( 'h3' );
                    $h4_elements = $li_element->getElementsByTagName( 'h4' );
                    $p_elements = $li_element->getElementsByTagName( 'p' );

                    foreach( $h3_elements as $h3_element) {

                        $h3_class = $h3_element->getAttribute( 'class' );
                        $is_null = $wpdb->query( "SELECT IFNULL( SELECT * FROM '{$wpdb->prefix}classifieds' WHERE title = {$h3_element->nodeValue})" , true );      

                        if( $h3_class == 'title' && $is_null ) {

                            echo "<h3>$h3_element->nodeValue</h3>";

                        }

                    }

                    foreach( $img_elements as $img_element) {

                        $src = $img_element->getAttribute( 'src' );

                        if( strpos( $src, 'img' ) && ! strpos( $src, 'no-img' ) ) {

                            echo "<img src="https://codeworpress.com/error-fatal-de-php-error-no-detectado-llamada-a-la-funcion-member-null-null/$src" />";

                        }

                    }

                    foreach( $p_elements as $p_element) {

                        $p_class = $p_element->getAttribute( 'class' );

                        if( $p_class == 'description' ) {

                            echo "<p>$p_element->nodeValue</p>";

                        } elseif( $p_class == 'locale' ) {

                            echo "<p><strong>$p_element->nodeValue</strong></p>";

                        } elseif( $p_class == 'timestamp' ) {

                            echo "<p>$p_element->nodeValue</p>";

                        }

                    }

                    foreach( $h4_elements as $h4_element) {

                        $h4_class = $h4_element->getAttribute( 'class' );

                        if( $h4_class == 'price' ) {

                            echo "<h4>$h4_element->nodeValue</h4>";

                        }

                    }

                }

            }

        }

    }


(@ gaiement)

il y a 1 an, 6 mois

Où et quand cela se produit-il ? Vous devez être dans un environnement WordPress pour avoir des variables globales WordPress, et vous devez avoir les variables définies sur leurs valeurs.


(@richdeveloper)

il y a 1 an, 6 mois

C’est un plugin que je développe et j’ai aussi appelé cette variable globale dans un autre fichier de ce plugin et ça marche, mais dans ce cas ça retourne null et ça ne marche pas, pourquoi ça ne marche pas ?

Cette réponse a été modifiée il y a 1 an et 6 mois.


(@ gaiement)

il y a 1 an, 6 mois

Cela ne répond pas à la question de savoir où et quand il est administré. L’as-tu attrapé init? L’as-tu attrapé wp_loaded? Est-ce un filtre ? Fonctionne-t-il sur la page d’administration ou la page d’accueil ?


(@richdeveloper)

il y a 1 an, 6 mois

Désolé de répondre immédiatement. C’est une fonction de classe personnalisée dans l’additif passe-partout de Devin Vinson. Dans la fonction d’activation, la variable globale fonctionne dans une classe personnalisée qui ne fonctionne pas.


(@richdeveloper)

il y a 1 an, 6 mois

Mise à jour : j’ai essayé de revendiquer wp-db.php avec la constante ABSPATH mais ces résultats ne sont pas définis. La variable globale $wpdb renvoie le même résultat que null – pourquoi ?


(@ gaiement)

il y a 1 an, 6 mois

Vous n’avez pas encore répondu à la question, il est donc difficile de vous aider. Si vous travaillez avec le code de quelqu’un d’autre, vous devriez poser une question à l’auteur. Sinon, nous ne pouvons que deviner ce que vous faites.


(@richdeveloper)

il y a 1 an, 6 mois

Essayer de mieux expliquer: j’ai trouvé une prise passe-partout Devin Vinson et je l’ai personnalisée avec mon code que vous voyez ci-dessus. Maintenant, mon code renvoie cette erreur car la variable globale $wpdb ou la constante ABSPATH n’est pas visible ou validée. Mais comment puis-je l’inclure dans mon code personnalisé ? Désolé si je ne peux pas m’expliquer.


(@diondesigns)

il y a 1 an, 6 mois

Vous appelez votre classe/fonction en dehors de WordPress. Cela se produit généralement lors du chargement d’un fichier PHP personnalisé via AJAX. Cela peut être fait, mais cela demande beaucoup de travail si vous souhaitez utiliser les classes/fonctions/etc. de WordPress.

Si vous avez besoin de plus d’aide, vous devrez nous montrer le code qui appelle votre classe/fonction.


(@richdeveloper)

il y a 1 an, 6 mois

D’accord @diondesigns et @joyously pouvez-vous m’envoyer un e-mail pour vous ajouter à mon référentiel github afin que je puisse partager mon code avec vous ?


(@ gaiement)

il y a 1 an, 6 mois

Non, vous n’avez qu’à répondre aux questions “où et quand le code est-il fourni ?” Trouver la réponse à cette question peut vous aider à voir ce qui ne va pas avec votre code.


(@richdeveloper)

il y a 1 an, 6 mois

Ok, jusqu’à présent, je comprends que j’utilise cette variable d’environnement WordPress globale pour renvoyer null. Maintenant la question est : comment puis-je utiliser cette variable globale depuis un environnement WordPress ? Dois-je envelopper ma fonction dans un crochet avant ? Ou existe-t-il des moyens d’inclure $wpdb ? Je cherche sur Internet, mais ma recherche est probablement erronée.


(@ gaiement)

il y a 1 an, 6 mois

Si vous n’avez besoin que de la variable $wpdb, vous pouvez la charger vous-même ou non. Mais vous avez d’autres appels de fonction WP dans votre code. Par conséquent, vous devez savoir quand vous souhaitez exécuter ce code. Cela peut être sur une planification cron, ou en activant un plugin, ou chaque fois qu’un travail est enregistré. Je ne sais pas ce dont vous avez besoin, mais il semble s’interfacer avec WP, donc il doit probablement être dans un cerceau qui a du sens dans la façon dont WP fait les choses. https://codex.wordpress.org/Plugin_API/Action_Reference


(@diondesigns)

il y a 1 an, 6 mois

Il est $wpdb il n’y a pas de variables en dehors de l’environnement WordPress. Si vous voulez l’utiliser, vous avez besoin du code WordPress qui crée le $wpdb variable. Le code réel pour ce faire est simple :

define('SHORTINIT', true);
require_once($path_to_wordpress . 'wp-load.php');

Le problème est le $path_to_wordpress variable. Si vous pouvez être sûr à 100% qu’il s’agit de l’emplacement de votre plugin [wproot]/wp-content/plugins/[yourplugin]alors il est facile de créer un chemin relatif wp-load.php. Mais WordPress autorise les sites wp-content répertoire à des endroits en dehors de la racine WordPress, vous ne pouvez donc pas être sûr à 100% si votre plugin est uniquement installé sur des sites que vous contrôlez.

Notez la définition de SHORTINIT constant. Cela indique à WordPress de charger les bases de données, le cache et les liens système, et rien d’autre. En fonction de votre flux de code, vous ne voulez pas charger tout WordPress… mais si vous le faites vraiment, supprimez cette ligne.


(@richdeveloper)

il y a 1 an, 6 mois

D’accord, j’ai compris. Comment voyez-vous que j’utilise plus de fonctionnalités WP, mais rien de tout cela ne fonctionne car WP n’est pas chargé ? Je dois donc inclure ou lier wp-load.php, mais comment fonctionnent les autres plugins ?


(@diondesigns)

il y a 1 an, 6 mois

Comme je n’ai aucune idée de ce que vous faites dans votre plugin, je ne peux pas répondre à votre question. Si cela est dû à un gestionnaire AJAX, cela ne se produira pas dans la plupart des plugins car ils utilisent admin-ajax.php pour votre contrôleur AJAX.

J’ai également regardé la prise standard que vous utilisez. Une tâche relativement simple est une tâche complexe (inutile) et nécessite de nombreuses connaissances en PHP. L’expression “essayer d’enfoncer une cheville carrée dans un trou rond” apparaît. 🙂

Cela a-t-il résolu votre problème ?

Was this helpful?

0 / 0

Leave a Reply 0

Your email address will not be published. Required fields are marked *