Elementi del menu di navigazione che scompaiono (ma non immediatamente)
Sto lavorando a un sito in cui alcuni elementi del menu di navigazione scompaiono (dal front-end, dal back-end e dal database). Tuttavia, il debug è estremamente difficile poiché non scompaiono immediatamente! Di conseguenza, non riesco a capire cosa attivi l'eliminazione.
Ulteriori informazioni:
- Sembra che gli elementi del menu di tipo 'personalizzato' (ad esempio collegati a un URL arbitrario, piuttosto che a un articolo/pagina/categoria ecc.) potrebbero essere al sicuro. Non ne sono ancora al 100% sicuro.
- Ad un certo punto, i nuovi elementi del menu non venivano salvati - aggiungevo diversi elementi a un menu, cliccavo su "Salva menu", e il menu veniva salvato senza elementi.
Qualche suggerimento su come eseguire il debug di questo problema particolarmente frustrante?
Questo succede sulla versione 3.4.1. Ho appena aggiornato alla 3.4.2, ma oggi non posso ancora verificare se il problema persiste (anche se non ho motivo di credere che non accadrà).
Modifica: Ho confermato che gli elementi del menu "personalizzati" (collegamenti a URL arbitrari, rispetto a una pagina/categoria/ecc. di WP) non vengono eliminati.

Registrare le query
Come dice la domanda "non succede sempre", è difficile capire cosa stia realmente accadendo. Quando non puoi vedere cosa succede (query in background) e non sai quando succede, allora è meglio registrarlo.
Il logger
All'attivazione, il plugin cercherà di creare una directory di log chiamata 'nav_log'
nella cartella temporanea - genererà e stamperà un errore se questo non funziona.
Proverà poi a scrivere in un file chiamato 'nav_log.txt'
all'interno della directory temporanea. Dovresti ottenere una voce di log ogni volta che viene attivata una query per un nav_menu_item
. I log saranno preceduti dalla data (Y-m-d g:i:s
). Quindi, se rimani vigile e cerchi di cogliere i cambiamenti nell'interfaccia utente, dovresti essere in grado di capire quando succede. Ho anche aggiunto la variabile globale $hook_suffix
per (forse) aiutare a determinare quando ciò accade.
Disclaimer: Il plugin ha bisogno di qualche miglioramento e non funzionerà subito. La gestione del filesystem è complicata e il plugin è solo uno schizzo/un'idea.
<?php
! defined( 'ABSPATH' ) AND exit;
/** Plugin Name: (#64487) »kaiser« log nav menu query */
# Version: 2012-09-17.0924
if ( ! class_exists( 'wpse64487_query_logger' ) )
{
register_activation_hook( __FILE__, array( 'wpse64487_query_logger', 'create_log_dir' ) );
add_action( 'plugins_loaded', array( 'wpse64487_query_logger', 'init' ), 5 );
class wpse64487_query_logger
{
public static $instance;
public $name = 'nav_log';
public static function init()
{
null === self :: $instance AND self :: $instance = new self;
return self :: $instance;
}
public function __construct()
{
add_filter( 'posts_where', array( $this, 'ask_where' ) );
}
public function create_log_dir()
{
$output = true;
// Relativo alla directory Temp
if ( ! wp_mkdir_p( $this->get_log_loc() ) )
$output = new WP_Error( __CLASS__, 'Creazione directory Log fallita.' );
is_wp_error( $output ) AND print $output->get_error_message( __CLASS__ );
}
public function get_log_loc( $full = false )
{
$output = trailingslashit( get_temp_dir()."{$this->name}" );
$full AND $output .= "{$this->name}.txt";
return $output;
}
public function ask_where( $where )
{
if ( "`post_type` = 'nav_menu_item'" === $where )
{
add_filter( 'posts_clauses', array( $this, 'catch_query' ) );
}
return $where;
}
public function catch_query( $pieces )
{
global $wp_filesystem, $hook_suffix;
$file = $this->get_log_loc( true );
$contents = $wp_filesystem->get_contents( $file );
// Aggiungi la query corrente
$contents .= "\n\n@".date( "Y-m-d g:i:s" );
$contents .= "\n Query: ".implode( ' ', $pieces );
$contents .= "\n Pagina: {$hook_suffix}";
$wp_filesystem->put_contents(
$file
,$contents
,FS_CHMOD_FILE
);
return $pieces;
}
} // END Class wpse64487_query_logger
} // endif;

Hai disattivato eventuali plugin che potresti aver installato?
Se l'hai già fatto e il problema persiste, non posso consigliare una soluzione semplice con questa installazione. Ma hai provato, o almeno considerato, di eseguire un backup della tua installazione esistente, esportare il contenuto in un file XML e reinstallare con un database pulito e nessun plugin attivato inizialmente, usando solo il tema desiderato? La nuova installazione dovrebbe avere i file core standard (senza codice personalizzato). Prima di reimportare il tuo contenuto, prova a configurare un menu e verifica se il problema si ripresenta. Se succede, puoi escludere un database danneggiato e penso sia sicuro affermare che il problema risieda da qualche parte nei file del tuo tema.
Ricorda solo di annotare i valori attuali delle opzioni core prima di cancellarli con una nuova installazione pulita.

Ho solo alcuni plugin installati e sono tutti plugin "sicuri". Tuttavia, ho molto codice personalizzato nelle directory del tema e mu-plugins. La mia sfida è capire come debuggare il problema, data la natura casuale/intermittente del problema.

Ok ma non escluderei la possibilità di un database corrotto. Non sono sicuro di come potrebbe accadere o completamente sicuro di come potrebbe influenzare i menu, ma le impostazioni transient nella tabella options potrebbero essere una possibile causa. Forse sono state modificate ad un certo punto?
