昨日からwp_scheduled_auto_draft_delete
cronジョブはどういうわけか私たちのメニューからすべてのページエントリを削除します。 wp_postmeta
とmeta_key = '_menu_item_object'
を含むテーブルmeta_value = 'page'
内のすべてのエントリは、このプロセスで削除されます。 DELETEクエリをさかのぼることで、メニューエントリが_wp_delete_post_menu_item
という関数によって削除されることがわかりました。私はその関数のために以下のスタックトレースを得ました:
#0 _wp_delete_post_menu_item(3244)
#1 call_user_func_array(_wp_delete_post_menu_item, Array ([0] => 3244))
called at [/srv/www/htdocs/biva/wp-includes/plugin.php:470]
#2 do_action(delete_post, 3244) called at
[/srv/www/htdocs/biva/wp-includes/post.php:2483]
#3 wp_delete_post(3244, 1) called at
[/srv/www/htdocs/biva/wp-includes/post.php:5645]
#4 wp_delete_auto_drafts()
#5 call_user_func_array(wp_delete_auto_drafts, Array ()) called at
[/srv/www/htdocs/biva/wp-includes/plugin.php:546]
#6 do_action_ref_array(wp_scheduled_auto_draft_delete, Array ()) called
at [/srv/www/htdocs/biva/wp-cron.php:100]
しかし、私はここで立ち往生しています、私はワードプレスの開発者ではありません、そしてメインページはまだ存在しますが古いドラフトを削除すると添付されたメニューエントリが削除される理由はわかりません。
回避策:回避策として、wp-config
の先頭に次の行を追加しました。wp-cron
を無効にします。
/** Disable wp-cron to prevent menu from getting deleted. Detailed Bug description:
http://wordpress.stackexchange.com/questions/145953 **/
define('DISABLE_WP_CRON', true);
同様の問題が発生した場合は、wp_postmeta
とmeta_key = '_menu_item_object'
を使用してテーブルmeta_value = 'page'
の行をロックしてからWPこれらの行を削除しようとしたときにエラーメッセージをたどってみてください。
エラーを再現する:間違いなく私たちのエラーの原因はステルスパブリッシュプラグインです、以下のようにすることで、簡単に再現することができます。
wp_scheduled_auto_draft_delete
cronジョブは、毎日実行され、ページにアクセスしてすぐに7日間実行されないため、実行されます。保存されていないダミーページは7日以上経過しているため削除するとメニューが消えます。私はエラーを再現する方法についてのスクリーンキャストを録画しました(しかし、私はそれをコメントする時間がかかりませんでした): http://www.youtube.com/watch?v=R9CTggjIfDY
これが wp_get_associated_nav_menu_items()
によって実行される通常のクエリのようなものです。
SELECT wp_posts.*
FROM wp_posts
INNER JOIN wp_postmeta
ON ( wp_posts.id = wp_postmeta.post_id )
WHERE 1 = 1
AND wp_posts.post_type = 'nav_menu_item'
AND (( wp_posts.post_status <> 'trash'
AND wp_posts.post_status <> 'auto-draft' ))
AND (( wp_postmeta.meta_key = '_menu_item_object_id'
AND Cast(wp_postmeta.meta_value AS CHAR) = '3111' ))
GROUP BY wp_posts.id
ORDER BY wp_posts.post_date DESC
これはあなたのように見えるものです:
SELECT wp_posts.*
FROM wp_posts
INNER JOIN wp_postmeta
ON ( wp_posts.id = wp_postmeta.post_id )
LEFT JOIN wp_postmeta AS mt1
ON ( wp_posts.id = mt1.post_id
AND mt1.meta_key = '_stealth-publish' )
INNER JOIN wp_postmeta AS mt2
ON ( wp_posts.id = mt2.post_id )
WHERE 1 = 1
AND wp_posts.post_type = 'nav_menu_item'
AND (( wp_posts.post_status <> 'trash'
AND wp_posts.post_status <> 'auto-draft' ))
AND ( ( wp_postmeta.meta_key = '_menu_item_object_id'
AND Cast(wp_postmeta.meta_value AS CHAR) = '3244' )
OR mt1.post_id IS NULL
OR ( mt2.meta_key = '_stealth-publish'
AND Cast(mt2.meta_value AS CHAR) != '1' ) )
GROUP BY wp_posts.id
ORDER BY wp_posts.post_date DESC
それは_stealth-publish
のものは何もビジネスメニュー項目のための問い合わせを妨げることを全くしていないと私は思います。