2010-08-10 34 views
31

Estoy publicando algunos datos en un script PHP a través de jQuery AJAX, y todo se ejecuta correctamente, pero devuelve un error 404. En mi consola Firebug, la respuesta del script PHP es correcta. No entiendo cómo puede responder el script, y aún arroja un error 404. El método de devolución de llamada jQuery "error" se activa y el método "éxito" no.jQuery Ajax devolviendo el error 404, pero la respuesta correcta

Todas las declaraciones realizadas por el trabajo de script PHP con precisión, porque puedo ver la base de datos se actualizan, etc.

estoy usando jQuery 1.4.2, en un sitio web de WordPress 3.x organizada por Dreamhost.

----------- ----------- MÁS INFORMACIÓN

OK, he descubierto que cuando incluyo archivo de WordPress en el wp-blog-header.php Script Ajax, obtengo el error. Además, alguna vez estos scripts funcionan, y estoy 90% seguro de que dejaron de funcionar después de la actualización de WP 3.0. Pegaré los encabezados de respuesta de Firebug.

Esta respuesta de cabeza desde PHP que incluye el wp-blog-header.php y devuelve un error 404 en 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 

Esta respuesta de cabeza desde PHP que no incluye la wp-blog-header.php y devuelve un 200 OK en 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

Por favor, compruebe el script php si hay una línea que envía el encabezado 404 –

+0

Debe editar este nuevo descubrimiento en su pregunta original. – alex

+0

@alex - Acabo de hacer. Gracias por la entrada/consejo. –

Respuesta

46

Cuando incluye wp-blog-header.php, termina ejecutando la rutina de instalación de WordPress completa. Se llama a la función wp(), que llama al $wp->main(), que a su vez llama a varias funciones de configuración.

Uno de ellos es $wp->query_posts(), que llama $wp_the_query->query(), que a su vez llama a WP_Query 's función parse_query(). I sospecha que la indicación 404 se genera allí (su página AJAX no es una publicación WP, ni nada por el estilo) y luego se transforma en un encabezado de respuesta 404 por $wp->handle_404(), la función llamada después de query_posts() en main().

No estoy 100% seguro de que parse_query() es el culpable definitivo, pero le sugiero que vea si puede incluir wp-load.php, ya que creo que hace el trabajo real de crear los objetos a los que desea acceder.

Una vez más, realmente no uso WordPress, así que no puedo estar seguro, pero mirando el código fuente este parece ser el caso más probable, por lo que puedo decir.

+3

Tim. Te amo tanto que no tienes idea. Esto me ha perseguido por un tiempo. Cambiar el include a wp-load.php marcó la diferencia. Entonces, al final del día, supongo que ERA la actualización de WordPress lo que causó el problema. –

+1

¡Gran respuesta Tim! +1 – alex

+0

Sí, ojalá hubiera encontrado esto antes. Gracias Tim! –

3

he añadido un archivo ajax.php en una plantilla de WordPress una vez, y tenía este problema.

lo solucioné simplemente añadiendo en la parte superior de ajax.php

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

especie de truco, pero funcionó.

+0

Coloqué eso en la parte superior e inferior del script PHP, pero no lo ayudé. –

+1

Debe ser justo después de incluir 'wp-header.php', IIRC. – alex

+0

Sí, intenté. Aún no funcionó. Finalmente lo resolvió. ¡Gracias por su tiempo y paciencia! –

1

En general, no hay un montón de lugares donde WordPress devolverá un 404. Recomiendo encapsular el árbol fuente para esos lugares y colocar algún código de depuración para rastrear por qué está sucediendo.

0

Sobre la base de la respuesta de Tim, he cambiado el gancho yo era coger de "wp" a "init" en mi plugin y que dejó de darme la 404.

0

que tenía el mismo problema.

The Fix.

Cambio:

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

Para:

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

Esto también va a arreglar los errores de cabecera HTTP, si usted quiere tener una página WP exterior.

3

Nadie más publicó esto como una respuesta, por lo que vale la pena señalar. Debería incluir wp-load.php en lugar de wp-blog-header.php.

Si usted abre wp-blog-header.php verá por qué:

if (!isset($wp_did_header)) { 

    $wp_did_header = true; 

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

    wp(); 

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

} 

Si sólo se está dando salida JSON para una operación AJAX, lo hace no necesitan incluir template-loader.php. Esto creará una sobrecarga innecesaria y, por supuesto, proporcionará el error 404.

Esta 'solución' es necesaria para las versiones actuales y futuras de WordPress. Supongo que cualquier cosa más allá de 3.0 debe incluir wp-load.php como se indica.

+0

Esto funcionó para mí. –

Cuestiones relacionadas