Die Methode besteht aus zwei Schritten: Erstens einer Funktion zum Speichern Ihrer benutzerdefinierten Metabox-Felddaten (verknüpft mit save_post) und zweitens einer Funktion zum Lesen dieser neuen post_meta (die Sie gerade gespeichert haben), zum Überprüfen und Ändern des Ergebnisses von Speichern nach Bedarf (auch mit save_post verbunden, jedoch nach dem ersten). Wenn die Validierungsfunktion fehlschlägt, ändert die Validierungsfunktion den post_status direkt wieder in "ausstehend", wodurch effektiv verhindert wird, dass der Post veröffentlicht wird.
Da die Funktion save_post häufig aufgerufen wird, muss jede Funktion nur dann ausgeführt werden, wenn der Benutzer sie veröffentlichen möchte, und nur für Ihren benutzerdefinierten Beitragstyp (mycustomtype).
Normalerweise füge ich auch einige benutzerdefinierte Benachrichtigungsnachrichten hinzu, damit der Benutzer weiß, warum sein Beitrag nicht veröffentlicht wurde, aber diese wurden hier etwas kompliziert ...
Ich habe diesen genauen Code nicht getestet, aber es ist eine vereinfachte Version dessen, was ich in umfangreichen benutzerdefinierten Post-Type-Setups getan habe.
add_action('save_post', 'save_my_fields', 10, 2);
add_action('save_post', 'completion_validator', 20, 2);
function save_my_fields($pid, $post) {
// don't do on autosave or when new posts are first created
if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || $post->post_status == 'auto-draft' ) return $pid;
// abort if not my custom type
if ( $post->post_type != 'mycustomtype' ) return $pid;
// save post_meta with contents of custom field
update_post_meta($pid, 'mymetafield', $_POST['mymetafield']);
}
function completion_validator($pid, $post) {
// don't do on autosave or when new posts are first created
if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) || $post->post_status == 'auto-draft' ) return $pid;
// abort if not my custom type
if ( $post->post_type != 'mycustomtype' ) return $pid;
// init completion marker (add more as needed)
$meta_missing = false;
// retrieve meta to be validated
$mymeta = get_post_meta( $pid, 'mymetafield', true );
// just checking it's not empty - you could do other tests...
if ( empty( $mymeta ) ) {
$meta_missing = true;
}
// on attempting to publish - check for completion and intervene if necessary
if ( ( isset( $_POST['publish'] ) || isset( $_POST['save'] ) ) && $_POST['post_status'] == 'publish' ) {
// don't allow publishing while any of these are incomplete
if ( $meta_missing ) {
global $wpdb;
$wpdb->update( $wpdb->posts, array( 'post_status' => 'pending' ), array( 'ID' => $pid ) );
// filter the query URL to change the published message
add_filter( 'redirect_post_location', create_function( '$location','return add_query_arg("message", "4", $location);' ) );
}
}
}
Fügen Sie für mehrere Metabox-Felder einfach weitere Abschlussmarkierungen hinzu, rufen Sie mehr post_meta ab und führen Sie weitere Tests durch.