
Cuando WordPress se queda sin memoria, aparece la pantalla de «Ha habido un error crítico» o, en el registro de errores, una línea como esta:
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted
(tried to allocate 65536 bytes) in /home/usuario/public_html/wp-includes/class-wpdb.php on line 2350
La reacción típica es subir el límite. A veces funciona, pero es como poner un balde más grande bajo una gotera: el piso deja de mojarse, pero el techo sigue roto. Y el mes siguiente el balde vuelve a llenarse.
En esta entrada vamos a leer bien el error, entender qué límite manda y, lo más útil, medir quién se come la memoria con dos snippets.
Leer el error sin calculadora
El primer número es el límite que tenía PHP en ese momento, en bytes. Divide por 1.048.576 y tendrás megabytes. Los más comunes:
41943040= 40 MB (el valor por defecto de WordPress).67108864= 64 MB (el valor por defecto en multisitio).134217728= 128 MB.268435456= 256 MB.536870912= 512 MB.
El segundo número («tried to allocate») es lo último que se intentó guardar y no cupo. No es el culpable: es la gota que rebalsó el vaso.
La ruta y la línea dicen dónde se acabó la memoria, no quién la gastó. Si el error termina en un archivo de wp-includes, no significa que WordPress tenga la culpa: puede que un plugin cargara miles de registros y el núcleo fuera el que chocó contra el techo. Incluso el correo de «Tu sitio tiene problemas técnicos» señala al plugin donde se cortó la ejecución, que no siempre es el que gastó la memoria.
Los tres límites (y cuál manda)
- **
memory_limitde PHP. Lo fija el servidor (en cPanel, en Seleccionar versión de PHP o el MultiPHP INI Editor**). Es el techo real. - **
WP_MEMORY_LIMIT.** Se define enwp-config.php. WordPress lo usa para intentar subir el límite de PHP en la parte pública, nunca para bajarlo. Si PHP ya te da 256 MB y pones 64 MB, te quedas con 256 MB. - **
WP_MAX_MEMORY_LIMIT.** El techo para tareas pesadas del escritorio: procesar imágenes, tareas programadas y las pantallas de administración. Por defecto es 256 MB.
Dos trampas comunes. Si tu hosting no permite cambiar el límite desde PHP, las constantes de wp-config.php no sirven de nada: de ahí tantos «puse 512M y sigue igual». Y en el escritorio, solo los administradores reciben el límite alto; si el error solo les aparece a editores o gestores de tienda, ya tienes una pista.
Puedes ver los tres valores en Herramientas → Salud del sitio → Información, en las secciones Servidor y Constantes de WordPress.
Snippet 1: un registro de las peticiones más pesadas
Este mu-plugin anota en el registro cada petición que pase de un umbral, con su pico de memoria, el tipo de petición y la dirección. Activa el registro primero en wp-config.php:
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );
Luego guarda esto como wp-content/mu-plugins/cwp-medidor-memoria.php:
<?php
/**
* Plugin Name: Medidor de memoria (Curso WordPress)
* Description: Anota en debug.log las peticiones que gastan mucha memoria.
*/
const CWP_MEMORIA_AVISO_MB = 96; // Ajusta según tu límite.
register_shutdown_function( function () {
$pico = memory_get_peak_usage( true ) / 1048576;
if ( $pico < CWP_MEMORIA_AVISO_MB ) {
return;
}
if ( defined( 'WP_CLI' ) && WP_CLI ) {
$tipo = 'wp-cli';
} elseif ( wp_doing_cron() ) {
$tipo = 'cron';
} elseif ( wp_doing_ajax() ) {
$tipo = 'ajax';
} elseif ( is_admin() ) {
$tipo = 'escritorio';
} else {
$tipo = 'web';
}
$url = isset( $_SERVER['REQUEST_URI'] ) ? substr( $_SERVER['REQUEST_URI'], 0, 200 ) : '-';
error_log( sprintf( '[memoria] %.1f MB de %s | %s | %s', $pico, ini_get( 'memory_limit' ), $tipo, $url ) );
} );
Déjalo un par de días y abre wp-content/debug.log. Si todas las líneas apuntan a la misma pantalla (por ejemplo, el listado de pedidos o el editor), ya sabes dónde mirar.
Snippet 2: cuánta memoria suma cada plugin al cargar
Este segundo mu-plugin mide cuánto crece la memoria mientras carga cada plugin, y te muestra los 10 más pesados en el escritorio. Guárdalo como wp-content/mu-plugins/cwp-memoria-por-plugin.php:
<?php
/**
* Plugin Name: Memoria por plugin (Curso WordPress)
* Description: Visita /wp-admin/?cwp_memoria=1 siendo administrador.
*/
$GLOBALS['cwp_memoria'] = array( 'inicio' => memory_get_usage() );
add_action( 'plugin_loaded', function ( $archivo ) {
$GLOBALS['cwp_memoria'][ plugin_basename( $archivo ) ] = memory_get_usage();
} );
add_action( 'admin_notices', function () {
if ( ! isset( $_GET['cwp_memoria'] ) || ! current_user_can( 'manage_options' ) ) {
return;
}
$anterior = null;
$consumo = array();
foreach ( $GLOBALS['cwp_memoria'] as $nombre => $bytes ) {
if ( null !== $anterior ) {
$consumo[ $nombre ] = $bytes - $anterior;
}
$anterior = $bytes;
}
arsort( $consumo );
echo '<div class="notice notice-info"><p><strong>Memoria al cargar cada plugin:</strong></p><ol>';
foreach ( array_slice( $consumo, 0, 10, true ) as $nombre => $bytes ) {
echo '<li><code>' . esc_html( $nombre ) . '</code>: ' . esc_html( size_format( max( 0, $bytes ), 1 ) ) . '</li>';
}
echo '</ol><p>Pico de esta pantalla: ' . esc_html( size_format( memory_get_peak_usage(), 1 ) ) . '</p></div>';
} );
Entra a /wp-admin/?cwp_memoria=1 y verás la lista. Ojo con lo que mide: solo la carga de cada plugin, no el trabajo que hace después. Un plugin liviano al cargar puede ser el que dispara una consulta gigante en una pantalla concreta. Por eso conviene cruzar esta lista con el registro del snippet 1.
Para ver todo junto, el plugin gratuito Query Monitor muestra la memoria máxima, las consultas y qué plugin hizo cada una, en cualquier pantalla. Úsalo mientras investigas y desactívalo al terminar.
Confirmar al sospechoso
Cuando tengas un candidato, confírmalo sin afectar a tus visitas: el plugin Health Check & Troubleshooting tiene un «modo de solución de problemas» que desactiva plugins solo para ti. Desactiva el sospechoso, repite lo que provocaba el error y compara.
Y ahora sí, sube el límite (si hace falta)
Si el consumo es razonable para lo que hace tu sitio (una tienda grande, un constructor visual), subir el límite está bien. Hazlo en el servidor primero y luego en wp-config.php:
define( 'WP_MEMORY_LIMIT', '256M' );
Si el error sigue apareciendo con 512 MB, el problema no es el límite: es un plugin o una consulta que hay que corregir o reemplazar.
Al terminar, borra los dos mu-plugins y vuelve WP_DEBUG a false. El archivo debug.log puede crecer y no conviene dejarlo indefinidamente.
¿Tu debug.log apunta a un plugin y no sabes qué hacer con él? Comparte en el foro las líneas [memoria] y la lista de los 10 plugins más pesados, y vemos juntos si se configura, se reemplaza o se justifica subir el límite.





