web-dev-qa-db-ja.com

wp_delete_auto_drafts()はメニュー内のリンクを削除します

昨日からwp_scheduled_auto_draft_delete cronジョブはどういうわけか私たちのメニューからすべてのページエントリを削除します。 wp_postmetameta_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_postmetameta_key = '_menu_item_object'を使用してテーブルmeta_value = 'page'の行をロックしてからWPこれらの行を削除しようとしたときにエラーメッセージをたどってみてください。

エラーを再現する:間違いなく私たちのエラーの原因はステルスパブリッシュプラグインです、以下のようにすることで、簡単に再現することができます。

  1. 新しいWordpress 3.9.1をインストールしてください。
  2. ステルスパブリッシュプラグインをインストールします http://wordpress.org/plugins/stealth-publish
  3. いくつかのテストページを作成し、それらを新しいメニューに追加します。
  4. ダミーコンテンツを付けて新しいページを作成しますが、保存しないでください!。保存せずにページを離れる。
  5. システムの時間を8日後に変更します。
  6. wp_scheduled_auto_draft_delete cronジョブは、毎日実行され、ページにアクセスしてすぐに7日間実行されないため、実行されます。保存されていないダミーページは7日以上経過しているため削除するとメニューが消えます。
  7. 効果が表示されるまで、ページを数回更新する必要があります。

私はエラーを再現する方法についてのスクリーンキャストを録画しました(しかし、私はそれをコメントする時間がかかりませんでした): http://www.youtube.com/watch?v=R9CTggjIfDY

5
Gellweiler

これが 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のものは何もビジネスメニュー項目のための問い合わせを妨げることを全くしていないと私は思います。

5
Rarst