Fügen Sie benutzerdefinierte Post-Metas hinzu, wenn benutzerdefinierte Post-Typen veröffentlicht werden

Ich versuche, die postmeta-Tabelle mit einem benutzerdefinierten Wert zu füllen, wenn ein benutzerdefinierter Typ (‘my-solutions’) veröffentlicht wird. Ich habe ein paar Threads gelesen, den Codex und Pippins Blog zu diesem Thema und habe viele Variationen ausprobiert, aber ich kann das nicht zum Laufen bringen. Wenn jemand etwas hinzufügen oder korrigieren kann, wäre das großartig.

function run_when_my_solution_published( $post ){ global $wpdb; $id = $post->ID; if($post->post_type == 'my-solutions'){ $wpdb->insert('wp_postmeta', array( 'meta_id' => NULL , 'post_id' => $id , 'meta_key' => 'my_json' , 'meta_value' => 'json' ), array( '%d' , '%d' , '%s' , '%s' ) ); } } add_action('new_to_publish', 'run_when_my_solution_published'); 

Solutions Collecting From Web of "Fügen Sie benutzerdefinierte Post-Metas hinzu, wenn benutzerdefinierte Post-Typen veröffentlicht werden"

Neuere Neue Lösung:

 function wpse153622_transition_solution( $new_status, $old_status, $post ) { if ( $new_status != $old_status && 'publish' === $new_status && 'my-solution' === $post->post_type ) { update_post_meta( $post_id, 'my_json', 'json' ); } } add_action( 'transition_post_status', 'wpse153622_transition_solution', 10, 3 ); 

Dies sollte nur dann ausgetriggers werden, wenn 1. der Status des neuen Posts nicht derselbe ist wie der des alten Posts. 2. Der Status des neuen Posts entspricht der Veröffentlichung und 3. der Post-Typ entspricht Ihrem Post-Typ.

Neue Lösung

Edit: Nach dem Lesen von Post-Status-Übergängen, denke ich, sollte dies den Trick machen:

 function wpse153622_save_solution( $post_id, $post ) { update_post_meta( $post_id, 'my_json', 'json' ); } add_action( 'publish_my-solution', 'wpse153622_save_solution', 10, 2 ); 

Dies verwendet publish_my-solution , die nur dann ausgetriggers werden soll, wenn ein Beitrag vom Typ my-solution veröffentlicht wird. Siehe {status}_{post_type} hier .

Alte Lösung

Wenn Sie die save_post_{post_type} wird der Job für Sie ausgeführt. Er wird jedoch immer dann aufgerufen, wenn Sie den Post aktualisieren und veröffentlichen:

 function wpse153622_save_solution( $post_id, $post, $update ) { update_post_meta( $post_id, 'my_json', 'json' ); } add_action( 'save_post_my-solution', 'wpse153622_save_solution', 10, 3 ); 

Ich habe das schon einmal benutzt und es funktioniert, aber wie ich schon sagte, es wird immer dann aufgerufen, wenn Sie Änderungen am Post vornehmen. Ich denke nicht, dass das ein großes Problem sein wird.

Ich war in der Lage, Begriffe aus einem Post-Typ hinzuzufügen / zu entfernen, wenn er mit dem host transition_post_status . Ich habe Ihre Frage an meine Lösung unten angepasst:

 function run_when_my_solution_published( $new_status, $old_status, $post ) { global $wpdb; if($post->post_type == 'my-solutions' && $new_status == 'publish'){ $wpdb->insert('wp_postmeta', array( 'meta_id' => NULL , 'post_id' => $id , 'meta_key' => 'my_json' , 'meta_value' => 'json' ), array( '%d' , '%d' , '%s' , '%s' ) ); } } add_action ('transition_post_status', 'run_when_my_solution_published', 999, 3); 

Obwohl der Codex sagt, dass es nicht akzeptabel ist, diesen Haken zu benutzen, war es der einzige, den ich wirklich funktionierte.

Wie @Howdy_McGee gesagt hat, würde ich stattdessen stattdessen die Aktion publish_post verwenden.

Beispielcodeblock zum Senden einer E-Mail zum Veröffentlichen:

 function post_published_notification( $ID, $post ) { $author = $post->post_author; /* Post author ID. */ $name = get_the_author_meta( 'display_name', $author ); $email = get_the_author_meta( 'user_email', $author ); $title = $post->post_title; $permalink = get_permalink( $ID ); $edit = get_edit_post_link( $author, '' ); $to[] = sprintf( '%s < %s>', $name, $email ); $subject = sprintf( 'Published: %s', $title ); $message = sprintf ('Congratulations, %s! Your article “%s” has been published.' . "\n\n", $name, $title ); $message .= sprintf( 'View: %s', $permalink ); $headers[] = ''; wp_mail( $to, $subject, $message, $headers ); } add_action( 'publish_post', 'post_published_notification', 10, 2 ); 

Sie können mehr oder weniger verwenden, was Sie hier bereits zum Filtern nach post_type . Ich würde auch definitiv empfehlen, die function add_post_meta anstelle einer benutzerdefinierten $wpdb Abfrage zu verwenden.