菜单项无法正确保存,导致相关页面元数据重置

时间:2018-02-28 作者:battery.cord

我有一个wordpress站点在localhost上使用MAMP。在我尝试修改菜单之前,一切都很好。菜单上有大约34个项目,大部分是页面,还有一些自定义链接(我还没有制作页面的占位符)。

当我在修改菜单(添加其他页面或自定义链接)后尝试保存菜单时,菜单无法正确保存。我得到了一个保存成功的错误,但所有自定义链接都变成了一级菜单项,我试图添加的页面变成了一个空的自定义链接,并且(这是奇怪的部分)我试图添加的页面重置了其页面布局元数据。具体来说,页面顶部、页面底部和侧栏设置都重置为其默认设置。(这意味着突然出现了一个侧边栏和大量填充,使得页面看起来很糟糕,还有一个乱七八糟的菜单)。

我找到了一个few other 这些问题看起来很相似,我尝试了一些修复,特别是将这些行添加到mamps php中。ini:

max_input_vars = 5000
max_execution_time = 600
memory_limit = 64M
max_input_time = 600
我可以在phpMyAdmin的phpInfo中看到这些值。

这似乎完全是由服务器内存限制引起的,但这似乎是一个很低的数字,而且为内存限制提供的修复程序似乎无法解决此问题。

我可以使用菜单编辑器修复项目的位置,但一旦我尝试向菜单中添加新页面,现有的自定义链接将变为顶级,页面将显示为空白自定义链接。

我在调试日志中也没有看到任何异常,只有常见错误:

【2018年2月28日20:21:03 UTC】PHP通知:wp\\u richedit\\u pre isdeprecated 从版本4.3.0开始!请改用format\\u for\\u editor()。in/local/wp包括/功能。php在线3839[2018年2月28日22:22:52欧洲/柏林]php致命错误:调用/local/wp-content/themes/simpleflex/index中未定义的函数luxe\\u get\\u meta()。php在线3

然而,这并不能解决我的问题。我可以使用自定义程序修改菜单,但它对该问题的修复效果不佳。(主要是因为其他工作人员可能不记得以何种方式编辑菜单并导致此问题)。

2 个回复
最合适的回答,由SO网友:cjbj 整理而成

显然,这是非标准的WP行为,因此有很多事情可能是错误的,但有一些方法可以跟踪错误。我认为,最重要的是,通过定制器存储菜单是可行的。这意味着存储单个菜单项的功能wp_update_nav_menu_item 功能正常,因为此函数直接从自定义程序调用。

从菜单页到该函数的路径不同,即通过函数wp_nav_menu_update_menu_items. 考虑到只有在您想要保存菜单时才会出现问题,在执行此功能时系统性地出现问题,这并不复杂:

读取存储在数据库中的当前菜单,遍历$_POST 变量和调用wp_update_nav_menu_item 一个接一个地存储它们$_POST, 所以可能是用户在2下删除的,你会看到一个双foreach 涉及多维数组的循环,这解释了为什么事情会失控memorywise(这就是为什么您会看到wp_defer_term_counting 函数,以节省一些内存)。我的猜测是,内存问题会导致$args 变量传递给wp_update_nav_menu_item 因此菜单项出现故障。自从menu items are posts 在数据库中,即使在wp_update_nav_menu_item.

现在WP需要128 MB的内存限制,所以你应该提高这个限制。根据我的经验,64MB经常会导致意外的结果。

如果这不可能或不起作用,则有一个解决方法。还有第三个函数可以用来调用wp_update_nav_menu_item: wp_save_nav_menu_items. 这是一个ajax调用,您可以将其构建到菜单页面中,以逐个保存菜单项,而不必一次保存整个菜单,从而避免内存问题。这将涉及在每个菜单项中添加保存按钮,并删除常规保存按钮。有一个lenghty tutorial here. 这不是一个理想的解决方案,但如果您无法解决服务器问题,它可能会有所帮助。

SO网友:bueltge

我对你的问题没有任何解决办法。起初,我还考虑了max_input_vars.

但是,您应该调试保存过程,如下面的小示例,以获取包含每个菜单项中所有数据的数组。这应该有助于您解除对峙,保存过程是否正常,是在发送post数据或保存过程中保存之前出现的问题。

<?php
/**
 * Plugin Name: .my Debug
 */

add_action( \'wp_update_nav_menu\', function( $menu_id, $menu_data ) {

    var_dump($menu_data);

    return $menu_id;
}, 10, 2 );

add_action( \'wp_update_nav_menu_item\', function( $menu_id, $menu_item_id, $args ) {

    echo \'<pre>\'; var_dump($args); echo \'</pre>\';

    return $menu_id;
}, 10, 3 );
这两个函数首先调试菜单名,然后您应该得到每个菜单项的输出,然后保存。您可以在中找到此过程的函数/wp-admin/includes/nav-menu.php

结束