Visualización de errores de PHP de admin-ajax.php en WordPress 4.9+

5 minutos de lectura

avatar de usuario
owenmelbz

Tenemos algunos puntos finales personalizados configurados que hacen varias cosas, a las que accedemos a través de /wp/wp-admin/admin-ajax.php?action=some_action

Sin embargo, cada vez que hay un error durante el desarrollo, como sintaxis, lógica, fatal, etc., simplemente obtenemos “Error interno del servidor 500” al ver la página en el navegador.

Cada otra página en el sitio cuando hay un error, nos da el error de PHP, para ayudarnos a depurar.

Sin embargo, cuando el error proviene del admin-ajax.php área, tenemos que abrir nuestro archivo de registro de PHP para ver el error en su lugar, lo cual es más molesto cuando se desarrolla activamente

¿Hay algo en wordpress que deshabilite la visualización de errores en este espacio de nombres de URL? y si es así, ¿cómo podemos evitar esto para permitir la representación de los errores en el navegador?

  • Que quieres decir con PHP error en comparación con un 500? ¿Quiere decir advertencias que pueden rastrear ya que el error no está rompiendo el analizador?

    –Lawrence Cherone

    26 de marzo de 2018 a las 10:34


  • Como en, cada vez que PHP arroja un error/excepción, por cualquier motivo, si el script pasa por admin-ajax.php, muestra la página de error apache 500, en lugar de una página blanca con un mensaje de error.

    – owenmelbz

    26 de marzo de 2018 a las 11:59

ingrese la descripción de la imagen aquíSi desea ver los errores de PHP al usar ajax, abra el archivo wp-includes/load.php y en la línea 336, cambie esta línea:

if ( defined( 'XMLRPC_REQUEST' ) || defined( 'REST_REQUEST' ) || ( defined( 'WP_INSTALLING' ) && WP_INSTALLING ) || wp_doing_ajax() ) {
        @ini_set( 'display_errors', 0 );
    }

a

if ( defined( 'XMLRPC_REQUEST' ) || defined( 'REST_REQUEST' ) || ( defined( 'WP_INSTALLING' ) && WP_INSTALLING ) || wp_doing_ajax() ) {
        @ini_set( 'display_errors', 1 );
    }

Ahora podrá ver los errores de ajax en la consola de su navegador. ¡Recuerde deshacer esto cuando termine de depurar!

  • No estoy seguro de si ambos están relacionados porque funciona, pero sigo obteniendo Fatal error: Allowed memory size of 134217728 bytes exhausted

    – Salathiel Genèse

    4 de octubre de 2018 a las 4:18


  • Difícil depurar el error de WordPress detrás de la solicitud ajax (peor: en la ventana acoplable)… Finalmente descubrí el bucle infinito que causó la fuga. Gracias

    – Salathiel Genèse

    4 de octubre de 2018 a las 4:53

  • A partir de diciembre de 2018, el número de línea ahora es 353.

    – alguien en alguna parte

    14 de diciembre de 2018 a las 23:14

  • Los números de línea pueden cambiar. Así que busca la función. wp_debug_mode en el archivo. La línea a cambiar está dentro de esta función.

    – Melvin

    30 de noviembre de 2020 a las 6:57

  • En cuanto a junio de 2021, el número de línea es 471. Puede buscar el texto “display_errors” e iterar las coincidencias encontradas, fáciles de encontrar.

    -Mark Okhman

    2 de junio de 2021 a las 14:02

avatar de usuario
ABHola

Mejor solución

Habilite la salida de error de PHP antes de que ocurra el error

Agregue esto para habilitar la salida de error de PHP

@ini_set( 'display_errors', 1 );

Por ejemplo: al comienzo de la función de devolución de llamada ajax en este caso

Consejo:

Puedes usar el Avance pestaña junto a la Respuesta pestaña en la red de herramientas de desarrollo para representar el HTML en la salida de error. Para que puedas ver el error sin el HTML

Imagen

Explicación

No sé por qué WordPress no permite habilitar esta salida de error, pero no creo que editar el archivo de WordPress Core y deshacerlo después de la depuración no sea una buena idea, como se responde aquí.

A partir de esa respuesta, descubrí que solo necesitamos configurar el display_errors Configuración de inicio de PHP para true o 1
para dar salida a los errores.

Entonces, ¿por qué no configuramos esto donde queramos que funcione para que esto display_errors se habilitará solo para ese alcance.

No hay problema si no deshiciste esto a diferencia de la otra respuesta.

avatar de usuario
Grzegorz Adam Kowalski

Editar wp-includes/class-wp-fatal-error-handler.php y cambiar esto en display_default_error_template( $error, $handled ) (Línea: 193):

$message = sprintf(
                        '<p>%s</p><p><a href="%s">%s</a></p>',
                        $message,
                        /* translators: Documentation explaining debugging in WordPress. */
                        __( 'https://wordpress.org/support/article/debugging-in-wordpress/' ),
                        __( 'Learn more about debugging in WordPress.' )
                );

a

$message = sprintf(
                        '<p>%s</p><p><a href="%s">%s</a></p>',
                        $message . ' ' . json_encode($error),
                        /* translators: Documentation explaining debugging in WordPress. */
                        __( 'https://wordpress.org/support/article/debugging-in-wordpress/' ),
                        __( 'Learn more about debugging in WordPress.' )
                );

Luego obtenga una vista previa de la respuesta HTML a admin-ajax.php utilizando herramientas de desarrollo.

avatar de usuario
TortugaTread

https://codex.wordpress.org/Debugging_in_WordPress

 // Enable WP_DEBUG mode
define( 'WP_DEBUG', true );

// Enable Debug logging to the /wp-content/debug.log file
define( 'WP_DEBUG_LOG', true );

// Disable display of errors and warnings 
define( 'WP_DEBUG_DISPLAY', false );

Defina las siguientes constantes como tales. Podrás ver debug.log por debajo wp-content. Por lo general, también dejo la pantalla de depuración apagada porque causa el problema de los encabezados ya enviados.

EDITAR:

Entonces, aparentemente, el informe de errores está desactivado para las solicitudes ajax en la última línea del método wp_debug_mode() en wp-includes/load.php

if ( defined( 'XMLRPC_REQUEST' ) || defined( 'REST_REQUEST' ) || ( defined( 'WP_INSTALLING' ) && WP_INSTALLING ) || wp_doing_ajax() ) {
        @ini_set( 'display_errors', 0 );
    }

¿Ha sido útil esta solución?