Ada dua langkah untuk metode ini: pertama, fungsi untuk menyimpan data lapangan metabox khusus Anda (terhubung ke save_post), dan kedua, fungsi untuk membaca post_meta baru (yang baru saja Anda simpan), validasi, dan modifikasi hasil dari menyimpan sesuai kebutuhan (juga terhubung ke save_post, tetapi setelah yang pertama). Fungsi validator, jika validasi gagal, sebenarnya mengubah post_status segera kembali ke "pending", secara efektif mencegah posting dipublikasikan.
Karena fungsi save_post dipanggil banyak, setiap fungsi memiliki pemeriksaan untuk hanya mengeksekusi ketika pengguna bermaksud untuk mempublikasikan, dan hanya untuk jenis posting khusus Anda (mycustomtype).
Saya juga biasanya menambahkan beberapa pesan pemberitahuan khusus untuk membantu pengguna mengetahui mengapa posting mereka tidak dipublikasikan, tetapi yang agak rumit untuk dimasukkan di sini ...
Saya belum menguji kode persis ini, tetapi ini adalah versi yang disederhanakan dari apa yang telah saya lakukan dalam pengaturan jenis pos kustom berskala besar.
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);' ) );
}
}
}
Untuk beberapa bidang metabox, cukup tambahkan lebih banyak penanda penyelesaian dan ambil lebih banyak post_meta dan lakukan lebih banyak tes ..