web-dev-qa-db-fra.com

Les éléments de menu de navigation disparaissent (mais pas immédiatement)

Je travaille sur un site où certains éléments du menu de navigation disparaissent (du début à la fin, de l'arrière-plan et de la base de données). Cependant, le débogage est extrêmement difficile car ils ne disparaissent pas immédiatement! Par conséquent, je suis incapable de comprendre ce qui déclenche la suppression.

Plus d'informations:

  • Il semble que les éléments de menu de navigation de la variété "personnalisée" (par exemple, une URL arbitraire, plutôt qu'un article/page/catégorie, etc.) puissent être sûrs. Je n'en suis pas encore sûr à 100%.
  • À un moment donné, les nouveaux éléments du menu de navigation n’étaient pas enregistrés - j’en ajouterais plusieurs dans un menu, cliquez sur "Enregistrer le menu" et le menu serait enregistré sans aucun élément de menu.

Des suggestions sur la façon de déboguer ce problème particulièrement frustrant?

Ceci est sur 3.4.1. Je viens de mettre à jour la version 3.4.2, mais je ne peux pas encore vérifier aujourd'hui que cela se produit (même si je n'ai aucune raison de croire que cela ne se produira pas).

Edit: J'ai confirmé que les éléments de navigation "personnalisés" (liens vers des URL arbitraires, par opposition à une page/catégorie WP/etc.) Ne sont pas supprimés.

1
Travis Northcutt

Enregistrer les requêtes

Comme le dit la question "cela ne se produit pas toujours", il est difficile de dire ce qui se passe réellement. Lorsque vous ne pouvez pas voir ce qui se passe (requête en arrière-plan) et que vous ne savez pas quand cela se produit, il est préférable de le consigner.

Le logger

Lors de l'activation, le plug-in essaiera de créer un répertoire de journal nommé 'nav_log' dans le dossier temporaire. Il lancera et imprimera une erreur si cela ne fonctionne pas.

Il essaiera ensuite d'écrire dans un fichier nommé 'nav_log.txt' à l'intérieur du répertoire temporaire. Vous devriez obtenir une entrée de journal à chaque fois, une requête pour un nav_menu_item est déclenchée. Les journaux seront préfixés par la date (Y-m-d g:i:s). Donc, tant que vous gardez les yeux ouverts et essayez d’attraper les changements dans l’interface utilisateur, vous devriez être capable de dire quand et cela se produit. J'ai également ajouté le $hook_suffix global à (peut-être) aider à déterminer quand cela se produit.

Avertissement: Le plugin a besoin d'amour et ne fonctionnera pas immédiatement. Le système de fichiers est compliqué et le plugin est juste une esquisse/une idée

<?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;
        // Relative to the Temp Dir
        if ( ! wp_mkdir_p( $this->get_log_loc() ) )
            $output = new WP_Error( __CLASS__, 'Log Dir creation failed.' );

        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 );
        // Append current query
        $contents .= "\n\n@".date( "Y-m-d g:i:s" );
        $contents .= "\n Query: ".implode( ' ', $pieces );
        $contents .= "\n Page: {$hook_suffix}";
        $wp_filesystem->put_contents(
             $file
            ,$contents
            ,FS_CHMOD_FILE
        );
        return $pieces;
    }
} // END Class wpse64487_query_logger

} // endif;
1
kaiser

Avez-vous désactivé les plug-ins que vous avez éventuellement installés?

Si vous avez déjà essayé et que cela se produit encore, je ne peux pas recommander de solution simple à cette installation, mais avez-vous essayé, ou même envisagé, de sauvegarder votre installation existante, d'exporter votre contenu dans un fichier xml et de le réinstaller avec une base de données propre et aucun plugin activé pour commencer, juste le thème que vous désirez? La nouvelle installation doit comporter des fichiers standard (code non personnalisé). Avant de réimporter votre contenu, essayez de configurer un menu et voyez si cela se produit toujours. Si c'est le cas, vous pouvez exclure une base de données corrompue et je pense qu'il serait prudent de dire que le problème réside quelque part dans vos fichiers de thème.

Rappelez-vous simplement de noter vos valeurs d’options principales actuelles avant de les supprimer avec une installation propre.

0
Ben