Yöntemin iki adımı vardır: birincisi, özel meta kutu alan verilerinizi kaydetme işlevi (save_post'a bağlı) ve ikincisi, yeni post_meta'yı (yeni kaydettiğiniz) okuma, doğrulama ve sonucunu değiştirme işlevi gerektiğinde kaydetme (ayrıca save_post'a bağlanır, ancak ilkinden sonra). Doğrulama işlevi başarısız olursa, aslında post_status öğesini doğrudan "beklemede" olarak değiştirir ve gönderinin yayınlanmasını etkili bir şekilde önler.
Save_post işlevi çok fazla çağrıldığından, her işlev yalnızca kullanıcı yayınlamak istediğinde ve yalnızca özel yazı türünüz (özelim türü) için yürütülecek denetimlere sahiptir.
Ayrıca, kullanıcının gönderilerinin neden yayınlanmadığını bilmesine yardımcı olmak için genellikle bazı özel bildirim mesajları ekliyorum, ancak bunlar buraya dahil etmek biraz karmaşıklaştı ...
Bu tam kodu test etmedim, ancak büyük ölçekli özel yazı tipi kurulumlarında yaptığımın basitleştirilmiş bir sürümü.
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);' ) );
}
}
}
Birden çok meta kutu alanı için daha fazla tamamlama işareti ekleyin ve daha fazla post_meta alın ve daha fazla test yapın.