it-swarm.com.de

wp_delete_auto_drafts () löscht Links in Menüs

Seit gestern löscht der wp_scheduled_auto_draft_delete cron job irgendwie alle Seiteneinträge aus unseren Menüs. Alle Einträge in der Tabelle wp_postmeta mit meta_key = '_menu_item_object' und meta_value = 'page' werden dabei gelöscht. Durch das Zurückverfolgen der DELETE-Abfrage habe ich herausgefunden, dass die Menüeinträge durch eine Funktion namens _wp_delete_post_menu_item gelöscht werden. Ich habe den folgenden Stacktrace für diese Funktion:

#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]

Aber ich stecke hier fest, ich bin kein WordPress-Entwickler und ich habe keine Ahnung, warum das Löschen alter Entwürfe zum Löschen angehängter Menüeinträge führt, obwohl die Hauptseiten noch vorhanden sind.

Workaround: Als Workaround haben wir am Anfang von wp-config Folgendes hinzugefügt, wodurch wp-cron deaktiviert wird:

/** Disable wp-cron to prevent menu from getting deleted. Detailed Bug description:
http://wordpress.stackexchange.com/questions/145953 **/
define('DISABLE_WP_CRON', true);

Wenn Sie auf ähnliche Schwierigkeiten stoßen, können Sie versuchen, die Zeilen in der Tabelle wp_postmeta mit meta_key = '_menu_item_object' und meta_value = 'page' zu sperren und dann die Fehlermeldung zurückzuverfolgen, wenn WP versucht, diese Zeilen zu löschen. Auf diese Weise haben wir unseren Fehler behoben.

Reproduziere den Fehler: Es ist definitiv das Stealth Publish Plugin, das unseren Fehler verursacht. Man kann ihn leicht reproduzieren, indem man folgendes macht:

  1. Installieren Sie ein neues Wordpress 3.9.1.
  2. Installieren Sie das Stealth Publish Plugin http://wordpress.org/plugins/stealth-publish .
  3. Erstellen Sie einige Testseiten und fügen Sie sie einem neuen Menü hinzu.
  4. Erstelle eine neue Seite mit etwas Dummy-Inhalt, aber speichere sie nicht! . Verlasse die Seite ohne zu speichern.
  5. Ändern Sie die Systemzeit 8 Tage in die Zukunft.
  6. Der Cron-Job wp_scheduled_auto_draft_delete wird ausgeführt, da er täglich ausgeführt wird und 7 Tage lang nicht ausgeführt wurde, sobald Sie Ihre Seite besuchen. Ihre nie gespeicherte Dummy-Seite wird dann gelöscht, da sie älter als 7 Tage ist und das Menü verschwindet.
  7. Möglicherweise müssen Sie die Seite einige Male aktualisieren, bis der Effekt sichtbar wird.

Ich habe einen Screencast zum Reproduzieren des Fehlers aufgezeichnet (aber ich habe mir nicht die Zeit genommen, ihn zu kommentieren): http://www.youtube.com/watch?v=R9CTggjIfDY

5
Gellweiler

So sieht eine normale Abfrage aus, die von wp_get_associated_nav_menu_items() ausgeführt wird:

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 

So sieht deine aus:

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 

Ich nehme an, _stealth-publish stuff hat überhaupt nichts damit zu tun, nach Navigationsmenüpunkten zu suchen.

5
Rarst