¿Cómo llamo a la función menu_rebuild en Drupal 7?

13

Me gustaría llamar a la función menu_rebuild () , pero no estoy seguro de dónde pegar exactamente el fragmento de código.

No puedo encontrar el archivo update.php en ninguna parte de mi instancia local.

La razón por la que me gustaría intentar esto es porque eliminé todos los nodos, pero todavía aparecen debajo de la estructura del menú.

usuario12804
fuente
¿Desea reconstruir el menú de Drupal después de la actualización o qué?
Aboodred1
update.php estará en la carpeta raíz de drupal, es decir, /var/www/htdocs/drupaly modificarlo es una mala idea. ¿Podría agregar más detalles sobre por qué desea llamar a menu_rebuild?
GoodSp33d
Aboodred1, sí, me gustaría reconstruir el menú de drupal después de eliminar todos los nodos. 2-Stroker, drupal.stackexchange.com/questions/58606/…
usuario12804
@ user12804, ¿Está seguro de que son menús relacionados con los nodos? Si es así, ya respondí en la otra pregunta.
Sithu

Respuestas:

5

Cree un archivo con el siguiente contenido y simplemente colóquelo en el directorio raíz de Drupal. Digamos Vamos menu-rebuild.php. Ejecútelo http://example.com/menu-rebuild.php

<?php
error_reporting(E_ALL);
define('DRUPAL_ROOT', getcwd());
require_once './includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

menu_rebuild();
Sithu
fuente
Puede ser más fácil para ejecutar esta usando devel
mbomb007
15

Drupal 7

Si está usando drush, puede ejecutar:

drush eval 'menu_rebuild();'

Si no funciona, vea: ¿Cómo hacer la reconstrucción del menú cuando se produce un error grave de PHP?

Drupal 6

drush php-eval 'drupal_rebuild_theme_registry()'

memcached

Si está utilizando memcached, debe reiniciarlo.

En Linux: /etc/init.d/memcached restart

En OS X (si usa Homebrew): brew services restart memcached

kenorb
fuente
vote por los comandos drush correctos para hacerlo fácilmente, pero definitivamente debe agregar que en algunos casos necesita vaciar las tablas de la base de datos correspondientes antes de lo mencionado por @Valk arriba
nilsun
11

Abra el esquema de la base de datos, luego elimine todo el contenido de las tablas menu_links y menu_router con las siguientes consultas SQL:

DELETE FROM menu_links;
DELETE FROM menu_router;

Luego ejecute http://example.com/update.php . Llamará a menu_rebuild (), que completará estas tablas con datos 'frescos'. Funcionó para mí después de que un "Error fatal de PHP: sin memoria" convirtió algunos de mis menús en un desastre.

Pero tenga en cuenta que eliminará todos los menús personalizados que deberá reconstruir manualmente. Para evitarlo, puede jugar un poco con la eliminación de algunos registros seleccionados de menu_router y menu_links, pero para mí no funcionó bien.

Y no olvide hacer una copia de seguridad de la base de datos y el directorio del sitio antes de eliminar el contenido de las tablas.

Valk
fuente
2
vote por la información adicional necesaria, que a veces DEFINITIVAMENTE necesita vaciar las tablas de la base de datos correspondiente antes de menu_rebuild. Esto se confirma aquí a partir de experiencias a largo plazo ...
nilsun
3

Un par de formas diferentes:

  1. Llamar menu_rebuild()desde hook_update_N
  2. Edite y guarde un formulario de configuración de menú del administrador de Drupal.
  3. Desde la línea de comando, con drush: drush cc menu
David Thomas
fuente
Gracias. ¿Puedo hacer esto sin drush también?
user12804
Sí, cualquiera de los 3 métodos anteriores funcionará por sí solo.
David Thomas
Re: Edite y guarde un enlace de menú del administrador de Drupal. No funciona, ya lo intenté varias veces ...
user12804
Sí, ese estaba destinado a la página de configuración del menú. También puede llamar menu_cache_clear_all()para reconstruir el caché del menú
David Thomas
2

Ir admin/config/development/performancey hacer clic en el botón "Borrar todas las cachés" hará que se reconstruya el menú, así como borrar la caché de plantilla, bloque, página, etc.

penten
fuente
Gracias Penten, lo intenté varias veces, pero no tuve suerte. Los nodos eliminados siguen apareciendo en la estructura del menú de navegación :(
user12804
2

Una forma alternativa es establecer variables:

variable_set('menu_rebuild_needed', TRUE);

Esto activará el menu_rebuild();

Michal Przybylowicz
fuente
0

Para corregir el uso del menú de administración en SQL y tenga en cuenta que, como Valk indicó anteriormente, eliminará toda la personalización de su menú de administración de administración. Después de ejecutarlo, borre su caché y el menú de administración se reconstruirá a su configuración predeterminada.

Aquí está la consulta SQL:

DELETE FROM menu_links WHERE menu_name='management' 
kenorb
fuente
para reconstruir el menú se vuelve necesario cuando algo está realmente roto y Drupal no puede arreglarlo en el medio. Es por eso que preferiría recomendar el método Valks porque un reinicio completo es una mejor respuesta para dicha pregunta si no se proporcionan más detalles QUÉ está roto.
nilsun