wp_publish_post bricht Permalinks ab

Ich erstelle ein System, wo einige benutzerdefinierte Post-Entwürfe vorbereitet werden, und nach bestimmten Aktionen von Moderatoren wird es automatisch veröffentlicht.

Also, zuerst erstelle ich einen Post-Entwurf wie folgt:

$newpost = array( 'post_title' => 'Raport '.date("Ymd"), 'post_content' => 'Add your content here', 'post_type' => 'raport', 'post_status' => 'draft', 'post_author' => $userid ); wp_insert_post($newpost); 

Dieser Entwurf erwartet Admins, etwas zu unternehmen. Es kann bearbeitet werden usw., und auf der Bearbeitungsseite ist der für diesen Beitrag entworfene Permalink in Ordnung.

Nachdem Administratoren bestimmte Aktionen ausgeführt haben, veröffentlicht das System den Post automatisch:

 wp_publish_post($id); 

Aber danach wird der Permalink der Post gebrochen. Anstelle des Standardpermalinks (der auf der Bearbeitungsseite sichtbar war):

 http://my-website.pl/raport/post-slug-name 

Der Permalink der Post nach wp_publish_post sieht so aus:

 http://my-website.pl/raport/ 

Dies verweist auf die Archivseite des benutzerdefinierten Posts, nicht auf den Post selbst.

Wie kann ich es reparieren und diese Posts veröffentlichen, ohne die Permalinks zu brechen?

Solutions Collecting From Web of "wp_publish_post bricht Permalinks ab"

Obwohl der Name der function wp_publish_post() vorschlägt, dass sie zum Veröffentlichen eines wp_publish_post() verwendet werden kann, sollte sie offensichtlich nicht dazu verwendet werden, einen Entwurf post programmatisch zu veröffentlichen.

wp_update_post() verwenden Sie wp_update_post() und legen den Post-Status manuell zum publish :

 < ?php // Update post with the ID 42 $postData = [ 'ID' => 42, 'post_status' => 'publish' ]; wp_update_post( $postData ); 

Dadurch wird ein gültiger Wert für das post_name Feld und somit ein ordnungsgemäßer Permalink erstellt.

Die function wp_publish_post() wird von WordPress nur für die Veröffentlichung zukünftiger Posts während eines geplanten check_and_publish_future_post() siehe check_and_publish_future_post() ). Der Grund dafür, dass Permalinks nicht beschädigt werden, besteht darin, dass Posts mit dem Status future bereits einen gültigen Wert für post_name der von wp_insert_post() .

Wenn Entwürfe veröffentlicht werden, wird der Permalink aus dem Titel des Beitrags umgeschrieben. Ursprünglich dachte ich, dass Sie vielleicht den Parameter $original_slug im wp_unique_post_slug Filter wp_unique_post_slug könnten, aber wp_unique_post_slug fand schnell, dass dieser beim Testen unzuverlässig ist.

Wenn Sie eine Methode haben, den Entwurf-Slug im globalen Gültigkeitsbereich zu wp_unique_post_slug durch eine classneigenschaft oder global), sollten Sie in der Lage sein, den Slug beim Publizieren über den wp_unique_post_slug mit etwas ähnlichem zu überschreiben:

 /** * Ensure the draft slug carries through when publishing a draft post. * * @param string $slug New post slug from title. * @param int $post_ID Post ID. * @param string $post_status New post status. * @param string $post_type Post type. * @param int $post_parent Post parent ID. * @param string $original_slug Original post slug. * @return string (maybe) filtered post slug. */ function wpdocs_restore_slug_on_publish( $slug, $post_ID, $post_status, $post_type, $post_parent, $original_slug ) { if ( $slug !== 'your-draft-slug' ) { $slug = 'your-draft-slug'; } return $slug; } add_filter( 'wp_unique_post_slug', 'wpdocs_restore_slug_on_publish', 10, 6 );