Wordpress nav menu page items disappear randomly

(Sorry for the long post, see conclusion below)

I have a multihomed WP environment, with some sites in production mode (with domain aliases) and some not "running" yet. There are five sites at the moment.

However, I have a very strange problem: some wp navigation menu items disappear randomly. Only the elements of the page remain - custom links, categories, etc. Still exist. The pages are still there, they are just removed from the menu. This happens once a week. The first few times I worked on the site, so I thought it was me who did something. But lately it happened, for example, in the middle of a weekend night, when none of my clients and me even touched the site.

It often seems like it's some kind of chain reaction - when menu items disappear on one site, it sometimes disappears on another, but not always - and not always at the same time. Today, for example, the menu disappeared on two sites ( http://wasabicms.se ) and ( http://womenswellness.se ), so I checked the others and they were fine. Then, after a few minutes, it disappeared on another site.

Server admin has gone through mysql, php and apache logs and can't find anything out of the ordinary. Lost menu items are no longer in wp_posts. Unfortunately, we cannot activate the mysql query logs, so we cannot know exactly how they are deleted.

Plugins that are installed and activated:

  • Additional custom fields

  • Additional Custom Fields: Options Page

  • Additional custom fields: repeater fields

  • Blog copier

  • Contact Form 7

  • Jetpack

  • New user approval

  • Redirect (the one posted by Urban Giraffe)

  • Simple 301 redirects

  • Wordpress importer

  • Displaying domain names in Wordpress

  • Wordpress SEO (from Yoast)

  • WP Instagram widget (by code for people)

However, I have used all of them except New User Approve and Wordpress MU Domain Mapping for other projects without any problems. I cannot turn them off as all sites use them and some are operational.


Conclusion

WP nav menu items (pages only) disappear from menus in multiple languages. The pages themselves still exist, only the navigation menu links disappear. This happens randomly (~ once a week) even if no one is working on the code or logging in for the admin. There are no errors logged in php, mysql or apache.


I'm sorry for the long post, but I really think it needs to be explained in detail. Does anyone admit this problem? Or can you point me in the right direction? I feel like I've tried everything. Thank you so much in advance!

+3


source to share


4 answers


I had this happen to me once with a new custom custom theme and the problem was with type / duplicate sorting when I registered a couple of menus in the function file. I created the menus and found that the menus disappeared without explanation at random at other times, even when they weren't working on the website. As a thought, since this might be a quick try, consider exploring the same option and make sure the menus are registered correctly and also rename them completely.



0


source


Finally decided!

We have several pages that only registered users can see. This is defined in the postmeta / custom field (generated by ACF). In header.php

we had a statement if

like the following so that users would be prompted to log in instead of just looking at a blank page or like this:

if ( ! is_user_logged_in() && get_field( 'show_page_logged_in_user' ) ) {

    // ... show login form

    get_footer();
    exit;
}

      

But to prevent pages from appearing in search results and RSS feeds, we also added this code to functions.php

:



function pre_hide_if_not_logged_in( $query ) {
    if ( ! is_user_logged_in() ) {
        $query->set( 'meta_query',
        array(
            'relation' => 'OR',
            array(
                'key'     => 'show_page_logged_in_user',
                'value'   => '%yes%',
                'compare' => 'NOT LIKE'
            ),
            array(
                'key'     => 'show_page_logged_in_user',
                'compare' => 'NOT EXISTS',
            )
        ) );
    }
}

add_action( 'pre_get_posts', 'pre_hide_if_not_logged_in' );

      

After applying the SQL logger, we found this applied to Wordpress cron jobs. But, of course, only when cron jobs were run for users without logging in, which made it completely random and yet (almost) synchronous. So we removed the action pre_hide_if_not_logged_in

and everything seems to be in place. We replaced it with the following. It's not that secure, but it can't interfere with db queries.

function hide_if_not_logged_in( $content ) {
    if ( get_field( 'show_page_logged_in_user' ) && ! is_user_logged_in() ) {
        return '';
    }

    return $content;
}

add_filter( 'the_content', 'hide_if_not_logged_in' );
add_filter( 'the_excerpt', 'hide_if_not_logged_in' );

      

I really hope this can save someone a few headaches.

0


source


I had the same behavior, the menu disappeared during the cron job due to the custom function hiding messages while modifying the request with a 'pre_get_posts'

hook. I found an easier way out (at least for my setup), which is to check if the current code is in the cron job before changing the request:

function pre_hide_if_not_logged_in( $query ) {
    if (defined('DOING_CRON')) {
        // we're running the cron, so return the query untouched
        return $query;
    }
    // now, since we're not running the cron, proceed to alter the query
    if ( ! is_user_logged_in() ) {
        // alter query here
        // ...
    }
}
add_action( 'pre_get_posts', 'pre_hide_if_not_logged_in' );

      

Works like a charm!

In my opinion this will work for you as well.

0


source


add_filter( 'wp_edit_nav_menu_walker', 'custom_nav_edit_walker',10,2 );
function custom_nav_edit_walker($walker,$menu_id) {
    return 'Walker_Nav_Menu_Edit_Custom';
}

/*
 * Saves new field navmenu
 */
add_action('wp_update_nav_menu_item', 'custom_nav_update',10, 3);
function custom_nav_update($menu_id, $menu_item_db_id, $args ) {
    if ( is_array($_REQUEST['menu-item-custom']) ) {
        $custom_value = $_REQUEST['menu-item-custom'][$menu_item_db_id];
        update_post_meta( $menu_item_db_id, '_menu_item_custom', $custom_value );
    }
}

/*
 * Adds value of new field to Navmenu
 */
add_filter( 'wp_setup_nav_menu_item','custom_nav_item' );
function custom_nav_item($menu_item) {
    $menu_item->custom = get_post_meta( $menu_item->ID, '_menu_item_custom', true );
    return $menu_item;
}


class Walker_Nav_Menu_Edit_Custom extends Walker_Nav_Menu  {
    function start_lvl( &$output, $depth = 0, $args = array() ) {}

        /**
         * Ends the list of after the elements are added.
         *
         * @see Walker_Nav_Menu::end_lvl()
         *
         * @since 3.0.0
         *
         * @param string $output Passed by reference.
         * @param int    $depth  Depth of menu item. Used for padding.
         * @param array  $args   Not used.
         */
         function end_lvl( &$output, $depth = 0, $args = array() ) {}

        /**
         * Start the element output.
         *
         * @see Walker_Nav_Menu::start_el()
         * @since 3.0.0
         *
         * @global int $_wp_nav_menu_max_depth
         *
         * @param string $output Used to append additional content (passed by reference).
         * @param object $item   Menu item data object.
         * @param int    $depth  Depth of menu item. Used for padding.
         * @param array  $args   Not used.
         * @param int    $id     Not used.
         */
         function start_el( &$output, $item, $depth = 0, $args = array(), $id = 0 ) {
            global $_wp_nav_menu_max_depth;
            $_wp_nav_menu_max_depth = $depth > $_wp_nav_menu_max_depth ? $depth : $_wp_nav_menu_max_depth;

            ob_start();
            $item_id      = esc_attr( $item->ID );
            $removed_args = array(
                'action',
                'customlink-tab',
                'edit-menu-item',
                'menu-item',
                'page-tab',
                '_wpnonce',
            );

            $original_title = false;
            if ( 'taxonomy' == $item->type ) {
                $original_title = get_term_field( 'name', $item->object_id, $item->object, 'raw' );
                if ( is_wp_error( $original_title ) ) {
                    $original_title = false;
                }
            } elseif ( 'post_type' == $item->type ) {
                $original_object = get_post( $item->object_id );
                $original_title  = get_the_title( $original_object->ID );
            } elseif ( 'post_type_archive' == $item->type ) {
                $original_object = get_post_type_object( $item->object );
                if ( $original_object ) {
                    $original_title = $original_object->labels->archives;
                }
            }

            $classes = array(
                'menu-item menu-item-depth-' . $depth,
                'menu-item-' . esc_attr( $item->object ),
                'menu-item-edit-' . ( ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? 'active' : 'inactive' ),
            );

            $title = $item->title;

            if ( ! empty( $item->_invalid ) ) {
                $classes[] = 'menu-item-invalid';
                /* translators: %s: title of menu item which is invalid */
                $title = sprintf( __( '%s (Invalid)' ), $item->title );
            } elseif ( isset( $item->post_status ) && 'draft' == $item->post_status ) {
                $classes[] = 'pending';
                /* translators: %s: title of menu item in draft status */
                $title = sprintf( __( '%s (Pending)' ), $item->title );
            }

            $title = ( ! isset( $item->label ) || '' == $item->label ) ? $title : $item->label;

            $submenu_text = '';
            if ( 0 == $depth ) {
                $submenu_text = 'style="display: none;"';
            }

            ?>
            <li id="menu-item-<?php echo $item_id; ?>" class="<?php echo implode( ' ', $classes ); ?>">
                <div class="menu-item-bar">
                    <div class="menu-item-handle">
                        <span class="item-title"><span class="menu-item-title"><?php echo esc_html( $title ); ?></span> <span class="is-submenu" <?php echo $submenu_text; ?>><?php _e( 'sub item' ); ?></span></span>
                        <span class="item-controls">
                            <span class="item-type"><?php echo esc_html( $item->type_label ); ?></span>
                            <span class="item-order hide-if-js">
                                <a href="
                                <?php
                                    echo wp_nonce_url(
                                        add_query_arg(
                                            array(
                                                'action'    => 'move-up-menu-item',
                                                'menu-item' => $item_id,
                                            ),
                                            remove_query_arg( $removed_args, admin_url( 'nav-menus.php' ) )
                                        ),
                                        'move-menu_item'
                                    );
                                ?>
                                " class="item-move-up" aria-label="<?php esc_attr_e( 'Move up' ); ?>">&#8593;</a>
                                |
                                <a href="
                                <?php
                                    echo wp_nonce_url(
                                        add_query_arg(
                                            array(
                                                'action'    => 'move-down-menu-item',
                                                'menu-item' => $item_id,
                                            ),
                                            remove_query_arg( $removed_args, admin_url( 'nav-menus.php' ) )
                                        ),
                                        'move-menu_item'
                                    );
                                ?>
                                " class="item-move-down" aria-label="<?php esc_attr_e( 'Move down' ); ?>">&#8595;</a>
                            </span>
                            <a class="item-edit" id="edit-<?php echo $item_id; ?>" href="
                                                                        <?php
                                                                        echo ( isset( $_GET['edit-menu-item'] ) && $item_id == $_GET['edit-menu-item'] ) ? admin_url( 'nav-menus.php' ) : add_query_arg( 'edit-menu-item', $item_id, remove_query_arg( $removed_args, admin_url( 'nav-menus.php#menu-item-settings-' . $item_id ) ) );
                                                                        ?>
                            " aria-label="<?php esc_attr_e( 'Edit menu item' ); ?>"><span class="screen-reader-text"><?php _e( 'Edit' ); ?></span></a>
                        </span>
                    </div>
                </div>

                <div class="menu-item-settings wp-clearfix" id="menu-item-settings-<?php echo $item_id; ?>">
                    <?php if ( 'custom' == $item->type ) : ?>
                        <p class="field-url description description-wide">
                            <label for="edit-menu-item-url-<?php echo $item_id; ?>">
                                <?php _e( 'URL' ); ?><br />
                                <input type="text" id="edit-menu-item-url-<?php echo $item_id; ?>" class="widefat code edit-menu-item-url" name="menu-item-url[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->url ); ?>" />
                            </label>
                        </p>
                    <?php endif; ?>
                    <p class="description description-wide">
                        <label for="edit-menu-item-title-<?php echo $item_id; ?>">
                            <?php _e( 'Navigation Label' ); ?><br />
                            <input type="text" id="edit-menu-item-title-<?php echo $item_id; ?>" class="widefat edit-menu-item-title" name="menu-item-title[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->title ); ?>" />
                        </label>
                    </p>
                    <p class="field-title-attribute field-attr-title description description-wide">
                        <label for="edit-menu-item-attr-title-<?php echo $item_id; ?>">
                            <?php _e( 'Title Attribute' ); ?><br />
                            <input type="text" id="edit-menu-item-attr-title-<?php echo $item_id; ?>" class="widefat edit-menu-item-attr-title" name="menu-item-attr-title[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->post_excerpt ); ?>" />
                        </label>
                    </p>
                    <p class="field-link-target description">
                        <label for="edit-menu-item-target-<?php echo $item_id; ?>">
                            <input type="checkbox" id="edit-menu-item-target-<?php echo $item_id; ?>" value="_blank" name="menu-item-target[<?php echo $item_id; ?>]"<?php checked( $item->target, '_blank' ); ?> />
                            <?php _e( 'Open link in a new tab' ); ?>
                        </label>
                    </p>
                    <p class="field-css-classes description description-thin">
                        <label for="edit-menu-item-classes-<?php echo $item_id; ?>">
                            <?php _e( 'CSS Classes (optional)' ); ?><br />
                            <input type="text" id="edit-menu-item-classes-<?php echo $item_id; ?>" class="widefat code edit-menu-item-classes" name="menu-item-classes[<?php echo $item_id; ?>]" value="<?php echo esc_attr( implode( ' ', $item->classes ) ); ?>" />
                        </label>
                    </p>
                    <p class="field-xfn description description-thin">
                        <label for="edit-menu-item-xfn-<?php echo $item_id; ?>">
                            <?php _e( 'Link Relationship (XFN)' ); ?><br />
                            <input type="text" id="edit-menu-item-xfn-<?php echo $item_id; ?>" class="widefat code edit-menu-item-xfn" name="menu-item-xfn[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->xfn ); ?>" />
                        </label>
                    </p>
                    <p class="field-description description description-wide">
                        <label for="edit-menu-item-description-<?php echo $item_id; ?>">
                            <?php _e( 'Description' ); ?><br />
                            <textarea id="edit-menu-item-description-<?php echo $item_id; ?>" class="widefat edit-menu-item-description" rows="3" cols="20" name="menu-item-description[<?php echo $item_id; ?>]"><?php echo esc_html( $item->description ); // textarea_escaped ?></textarea>
                            <span class="description"><?php _e( 'The description will be displayed in the menu if the current theme supports it.' ); ?></span>
                        </label>
                    </p>
                    <p class="field-custom description description-wide">
                        <label for="edit-menu-item-custom-<?php echo $item_id; ?>">
                            <?php _e( 'Custom' ); ?><br />
                            <input type="text" id="edit-menu-item-custom-<?php echo $item_id; ?>" class="widefat code edit-menu-item-custom" name="menu-item-custom[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->custom ); ?>" />
                        </label>
                    </p>                
                    <fieldset class="field-move hide-if-no-js description description-wide">
                        <span class="field-move-visual-label" aria-hidden="true"><?php _e( 'Move' ); ?></span>
                        <button type="button" class="button-link menus-move menus-move-up" data-dir="up"><?php _e( 'Up one' ); ?></button>
                        <button type="button" class="button-link menus-move menus-move-down" data-dir="down"><?php _e( 'Down one' ); ?></button>
                        <button type="button" class="button-link menus-move menus-move-left" data-dir="left"></button>
                        <button type="button" class="button-link menus-move menus-move-right" data-dir="right"></button>
                        <button type="button" class="button-link menus-move menus-move-top" data-dir="top"><?php _e( 'To the top' ); ?></button>
                    </fieldset>

                    <div class="menu-item-actions description-wide submitbox">
                        <?php if ( 'custom' != $item->type && $original_title !== false ) : ?>
                            <p class="link-to-original">
                                <?php
                                /* translators: %s: original title */
                                printf( __( 'Original: %s' ), '<a href="' . esc_attr( $item->url ) . '">' . esc_html( $original_title ) . '</a>' );
                                ?>
                            </p>
                        <?php endif; ?>
                        <a class="item-delete submitdelete deletion" id="delete-<?php echo $item_id; ?>" href="
                                                                                            <?php
                                                                                            echo wp_nonce_url(
                                                                                                add_query_arg(
                                                                                                    array(
                                                                                                        'action'    => 'delete-menu-item',
                                                                                                        'menu-item' => $item_id,
                                                                                                    ),
                                                                                                    admin_url( 'nav-menus.php' )
                                                                                                ),
                                                                                                'delete-menu_item_' . $item_id
                                                                                            );
                                                                                            ?>
                        "><?php _e( 'Remove' ); ?></a> <span class="meta-sep hide-if-no-js"> | </span> <a class="item-cancel submitcancel hide-if-no-js" id="cancel-<?php echo $item_id; ?>" href="
                        <?php
                        echo esc_url(
                            add_query_arg(
                                array(
                                    'edit-menu-item' => $item_id,
                                    'cancel'         => time(),
                                ),
                                admin_url( 'nav-menus.php' )
                            )
                        );
                        ?>
                            #menu-item-settings-<?php echo $item_id; ?>"><?php _e( 'Cancel' ); ?></a>
                    </div>

                    <input class="menu-item-data-db-id" type="hidden" name="menu-item-db-id[<?php echo $item_id; ?>]" value="<?php echo $item_id; ?>" />
                    <input class="menu-item-data-object-id" type="hidden" name="menu-item-object-id[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->object_id ); ?>" />
                    <input class="menu-item-data-object" type="hidden" name="menu-item-object[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->object ); ?>" />
                    <input class="menu-item-data-parent-id" type="hidden" name="menu-item-parent-id[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->menu_item_parent ); ?>" />
                    <input class="menu-item-data-position" type="hidden" name="menu-item-position[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->menu_order ); ?>" />
                    <input class="menu-item-data-type" type="hidden" name="menu-item-type[<?php echo $item_id; ?>]" value="<?php echo esc_attr( $item->type ); ?>" />
                </div><!-- .menu-item-settings-->
                <ul class="menu-item-transport"></ul>
            <?php
            $output .= ob_get_clean();
        }
}

      

0


source







All Articles