$ wpdb non restituisce risultati con la query SELECT sul tipo di post personalizzato, funziona sul tipo di post predefinito

EDIT: aggiunta di ulteriori informazioni di background.

Ho codificato un plugin che aggiunge una meta-box alla pagina del post. Quando il post viene pubblicato, il plug-in genererà un ID casuale per il post e inserirà l’ID casuale e il post guid in una tabella personalizzata nel database. Dopo la pubblicazione o la modifica, il plug-in interroga la tabella personalizzata per recuperare l’ID casuale per il post in base al post guid e stampa l’ID casuale nella casella meta.

Tutto funziona alla grande finché non cambio il tipo di post nella funzione add_meta_box da “post” a “quilt”. Il plugin genererà l’ID casuale e lo salverà e il post guid alla tabella, ma presenta questo errore nella meta-box:

Avviso: tentativo di ottenere la proprietà di non object in /home/qultshow/public_html/wp-content/plugins/randomID/randomID.php sulla riga 126

invece dell’ID casuale. Se io uso

var_dump( $query ); $wpdb->print_error(); 

per provare a eseguire il debug, vedo:

NULLO

Errore del database WordPress: [] SELECT * FROM wp_customtable WHERE qrci_guid = ” http://testsite.com/?post_type=quilt&p=213 ”

Se copio direttamente la query dall’errore del database di WordPress e la eseguo in phpmyadmin, viene restituita una riga come previsto. Quindi, la query è codificata correttamente e il plug-in funziona sul tipo di post predefinito di “post” ma non sul tipo di post personalizzato di “quilt”. L’unica modifica nel plugin è in questo codice:

add_meta_box( 'randomid_sectionid', 'Random ID', 'cd_meta_box_cb', 'quilt', 'normal', 'high' );

dove “post” è stato cambiato in “quilt”.

C’è qualcosa di strano o diverso nell’annotare il database da un tipo di messaggio personalizzato di cui ho bisogno per farlo funzionare?

Note: Questo plugin non è per l’utilizzo da parte di nessuno tranne me su un sito web in cui ho bisogno di questa strana funzionalità. Inoltre, questa è un’installazione multi-sito di wordpress se questo fa alcuna differenza. Non posso usare i metadati dei post per questo poiché devo essere in grado di interrogare questi dati senza interrogare ogni tabella postmeta sulla rete, quindi deve essere una tabella personalizzata nel database.

Ecco il codice pertinente che non restituisce una riga sui tipi di post personalizzati, ma restituisce una riga sui tipi di post predefiniti . Forse non è il miglior codice scritto, ma funziona sui tipi di post predefiniti :

 global $wpdb; $wpdb->show_errors(); $sql = 'SELECT * FROM ' . $wpdb->base_prefix . 'customtable WHERE qrci_guid = "'. $post->guid . '"'; $query = $wpdb->get_row($sql); $_quilt_id = $query->quilt_id; var_dump( $query ); $wpdb->print_error(); 

E ancora, ecco gli errori in esecuzione:

Avviso: provare a ottenere la proprietà di non object in /home/qultshow/public_html/wp-content/plugins/metaboxplugin/metaboxplugin.php sulla riga 126 somewebsite /? Post_type = quilt & p = 49

NULLO

Errore del database WordPress: [] SELECT * FROM wp_customtable WHERE qrci_guid = ” http://testsite.com/?post_type=quilt&p=213 ”

Inizialmente pensavo che ci fosse un problema con la e commerciale nella guida su cui la query cerca, perché veniva inserita nella tabella personalizzata come & invece di una semplice e commerciale. Ho risolto il problema, e ora è inserito correttamente nella tabella, come solo una e commerciale, quindi non ci dovrebbero essere problemi a tirare fuori un record dal tavolo. Detto questo, nei tipi di post predefiniti, la e commerciale non è nella guida, e il codice funziona alla grande. Forse è proprio questo il problema, ma non so come risolverlo.

Qualcuno può aiutare con questo?

Solutions Collecting From Web of "$ wpdb non restituisce risultati con la query SELECT sul tipo di post personalizzato, funziona sul tipo di post predefinito"

Ho risolto il problema da solo, anche se probabilmente non è il modo giusto per farlo. Nota che ho dovuto digitare “indirizzo-sito” invece dell’URL effettivo perché il sistema qui non mi consente di utilizzare più di un URL in un post senza più reputazione. Ciò rende abbastanza difficile trasmettere ciò che sta effettivamente accadendo, ma non c’è altra scelta per quello che sembra. Nel codice effettivo e nella tabella, l’URL effettivo è lì.

Il problema è che quando si tenta di selezionare un record dalla tabella in cui qrci_guid è un url come ” http://testsite.com/?post_type=quilt&p=213 ” sembra riagganciarsi alla e commerciale. All’inizio, $ post-> guid veniva inserito nella tabella personalizzata in questo modo:

 website-address/?post_type=quilt&p=213 

ma restituisce questo errore quando si tenta di recuperare i dati:

Errore del database WordPress: [] SELECT * FROM wp_customtable WHERE qrci_guid = “indirizzo-Web /? Post_type = quilt & p = 213”

L’istruzione select sta cercando & e il record contiene & . Ho provato a togliere la e dalla guida prima di inserirla nel tavolo e togliere la e commerciale da $ post-> guid prima di creare la query, ma non è stato ansible ottenere il record. Ciò ha comportato questo nella tabella:

 website-address/?post_type=quiltp=239 

che andava bene, perché non ho davvero bisogno della e commerciale in là comunque per i miei scopi, ma l’errore assomigliava a questo:

Errore del database WordPress: [] SELECT * FROM wp_customtable WHERE qrci_guid = “indirizzo-Web /? Post_type = quiltamp; p = 239”

quindi ancora nessun record restituito.

Alla fine, ho risolto questo problema utilizzando questo codice prima di inserire $ post-> guid nella tabella:

 $clean_guid = str_replace("&", "amp;", $post->guid); 

e inserendo $ clean_guid invece di $ post-> guid, e quindi usando questo codice prima di interrogare la tabella:

 $clean_guid = str_replace("&", "", $post->guid); 

e quindi utilizzando questa query per recuperare i dati:

 $sql = 'SELECT * FROM ' . $wpdb->base_prefix . 'customtable WHERE qrci_guid = "'. $clean_guid . '"'; $query = $wpdb->get_row($sql); 

che ha restituito la riga come previsto.

Come ho detto, probabilmente non è il modo giusto per farlo; So che ci sono funzioni PHP come htmlentities () e urlencode () e altre funzioni simili, una delle quali potrebbe essere stata quella giusta da usare in questa situazione, e ho persino imparato a usare tutte quelle funzioni in modo efficace tre o quattro anni fa stavo facendo un sacco di codice PHP. Ovviamente la mia esperienza di codifica è arrugginita e non ho potuto far funzionare nessuna di quelle funzioni, ma questa soluzione ha funzionato per me. Se c’è un modo migliore, sarei felice di sentirlo.

Se la tua query fallisce, otterrai l’errore “property of non-object”. Dovresti controllare che la query abbia restituito un risultato prima di provare ad usarlo.

 $query = $wpdb->get_row($sql); $_quilt_id = $query->quilt_id; if (!empty($_quilt_id)) { // your code } 

In secondo luogo, le tue query non corrispondono. Uno finisce con &p=49 , l’altro con &>p=49 . Quello che stai facendo dovrebbe funzionare se le domande sono corrette. Sono certo che questa sia la radice del problema.

Cercherei di evitare la ricerca di stringhe complesse come quella però. Non c’è un valore semplice che puoi usare, come un ID?