2010-08-10 1 views
31

Sto postando alcuni dati in uno script PHP tramite jQuery AJAX, e tutto viene eseguito correttamente, ma restituisce un errore 404. Nella mia console Firebug la risposta dello script PHP è corretta. Non capisco come lo script possa rispondere, e continua a generare un errore 404. Il metodo di callback "error" di jQuery si attiva e il metodo "success" non lo fa.jQuery Ajax restituisce 404 Errore, ma risposta corretta

Tutte le dichiarazioni effettuate dal lavoro di script PHP con precisione, perché posso vedere il database in fase di aggiornamento, ecc

sto usando jQuery 1.4.2, su un sito web 3.x WordPress ospitato da DreamHost.

----------- INFO -----------

OK, ho capito che quando ho include file di WordPress wp-blog-header.php nel Script Ajax, ho ricevuto l'errore. Inoltre, una volta questi script funzionano e io sono sicuro al 90% che hanno smesso di funzionare dopo l'aggiornamento WP 3.0. Incollo le intestazioni di risposta da Firebug.

Questa risposta colpo di testa da PHP che include il wp-blog-header.php e restituisce un errore 404 in Firebug ...

Date    Tue, 10 Aug 2010 01:44:44 GMT 
Server   Apache 
X-Powered-By  PHP/5.2.6 
X-Pingback  http://www.learnwake.com/xmlrpc.php 
Expires   Wed, 11 Jan 1984 05:00:00 GMT 
Cache-Control  no-cache, must-revalidate, max-age=0 
Pragma   no-cache 
Last-Modified  Tue, 10 Aug 2010 01:44:44 GMT 
Vary    Accept-Encoding 
Content-Encoding gzip 
Content-Length 36 
Keep-Alive  timeout=2, max=98 
Connection  Keep-Alive 
Content-Type  text/html; charset=UTF-8 

Questa risposta colpo di testa da PHP che non include la wp-blog-header.php e restituisce un 200 OK in Firebug ...

Date    Tue, 10 Aug 2010 01:44:58 GMT 
Server   Apache 
X-Powered-By  PHP/5.2.6 
Vary    Accept-Encoding 
Content-Encoding gzip 
Content-Length 36 
Keep-Alive  timeout=2, max=100 
Connection  Keep-Alive 
Content-Type  text/html 
+0

Pls controlla lo script php se c'è una riga che invia l'intestazione 404 –

+0

È necessario modificare questa nuova scoperta nella domanda originale. – alex

+0

@alex - L'ho fatto. Grazie per l'input/consiglio. –

risposta

46
Quando si include wp-blog-header.php, si termina l'avvio dell'intera routine di installazione di WordPress. Si chiama la funzione wp(), che chiama $wp->main(), che a sua volta chiama varie funzioni di impostazione.

Uno di questi è $wp->query_posts(), che chiama $wp_the_query->query(), che a sua volta chiama la funzione s' WP_Queryparse_query(). I sospetto che l'indicazione 404 viene generata lì (la pagina AJAX non è un post WP o qualcosa del genere) e successivamente viene trasformata in un'intestazione di risposta 404 effettiva da $wp->handle_404(), la funzione chiamata dopo query_posts() in main().

Non sono sicuro al 100% che parse_query() sia il colpevole definitivo, ma suggerirei di vedere se è possibile includere semplicemente wp-load.php invece, poiché credo che funzioni effettivamente la creazione degli oggetti a cui si desidera accedere.

Ancora una volta, in realtà non uso WordPress, quindi non posso esserne sicuro, ma guardando il codice sorgente questo sembra essere il caso più probabile, da quello che posso dire.

+3

Tim. Ti amo così tanto che non hai idea. Questo mi ha perseguitato per un po 'di tempo. Cambiare l'inclusione in wp-load.php ha fatto la differenza. Quindi, alla fine della giornata, presumo che sia stato l'aggiornamento di WordPress a causare il problema. –

+1

Ottima risposta Tim! +1 – alex

+0

Sì, vorrei averlo trovato prima. Grazie Tim! –

3

ho aggiunto un file ajax.php in un modello WordPress una volta, e aveva questo problema.

ho risolto semplicemente aggiungendo in cima ajax.php

header('Response: HTTP/1.1 200 OK'); 

specie di hack, ma ha funzionato.

+0

L'ho inserito sia nella parte superiore che in quella inferiore dello script PHP, ma non è stato di aiuto. –

+1

Dovrebbe essere subito dopo aver incluso 'wp-header.php', IIRC. – alex

+0

Sì, provato. Ancora non ha funzionato. Finalmente risolto. Grazie per il tuo tempo e la tua pazienza! –

1

Nel complesso non ci sono molti luoghi in cui WordPress restituisce un 404. Si consiglia di eseguire l'aggancio dell'albero dei sorgenti per quei luoghi e di inserire un codice di debug per tracciare il motivo per cui si sta verificando.

0

Sulla base della risposta di Tim, ho cambiato il gancio stavo recuperando da "wp" a "init" nel mio plug-in e si è fermato avermi dato l'404.

0

Ho avuto lo stesso problema.

La correzione.

Cambio:

require_once('wp-blog-header.php'); 

A:

require_once('conn.php'); 
require('wp-config.php'); 
$wp->init(); 
$wp->parse_request(); 
$wp->query_posts(); 
$wp->register_globals(); 

Questo sarà anche correggere gli errori di intestazione HTTP, se si vuole avere una pagina esterna WP.

3

Nessun altro ha postato questo come risposta, quindi vale la pena notare. Dovresti includere wp-load.php anziché wp-blog-header.php.

Se si apre wp-blog-header.php capirete perché:

if (!isset($wp_did_header)) { 

    $wp_did_header = true; 

    require_once(dirname(__FILE__) . '/wp-load.php'); 

    wp(); 

    require_once(ABSPATH . WPINC . '/template-loader.php'); 

} 

Se sei solo l'output JSON per un'operazione AJAX, si fa non bisogno di includere template-loader.php. Ciò creerà un sovraccarico non necessario e, naturalmente, fornirà l'errore 404.

Questa 'soluzione alternativa' è necessaria per le versioni attuali e future di WordPress. Sto assumendo che qualsiasi cosa oltre 3.0 dovrebbe includere wp-load.php come indicato.

+0

Questo ha funzionato per me. –