পদ্ধতির দুটি পদক্ষেপ রয়েছে: প্রথমত, আপনার কাস্টম মেটাবক্স ক্ষেত্রের ডেটা সংরক্ষণ করার জন্য একটি ফাংশন (সেভ_পোস্টে আবদ্ধ) এবং দ্বিতীয়ত, নতুন পোস্ট_মেটা (যা আপনি সবেমাত্র সংরক্ষণ করেছেন) পড়ার জন্য একটি ফাংশন, এটি বৈধতা দিন, এবং ফলাফলটির পরিবর্তন করুন প্রয়োজনীয় হিসাবে সংরক্ষণ করা (সেভ_পোস্টেও জড়িত, তবে প্রথমটির পরে)। বৈধকরণকারীর কার্য, যদি বৈধতা ব্যর্থ হয় তবে পোস্ট পোস্টস্ট্যাটাসটিকে ডান "পিছিয়ে" থেকে পরিবর্তিত করে কার্যকরভাবে পোস্টটি প্রকাশ হতে বাধা দেয়।
যেহেতু সেভ_পোস্ট ফাংশনটি প্রচুর পরিমাণে ডাকা হয়, প্রতিটি ফাংশনটিতে কেবল তখন ব্যবহারকারী কার্যকর করতে হয় এবং কেবলমাত্র আপনার কাস্টম পোস্টের জন্য (মাইকাস্টম টাইপ) পরীক্ষা করতে হয়।
আমি সাধারণত কিছু কাস্টম বিজ্ঞপ্তি বার্তা যুক্ত করি যাতে ব্যবহারকারীদের তাদের পোস্ট কেন প্রকাশিত হয় তা জানতে সহায়তা করে তবে সেগুলি এখানে অন্তর্ভুক্ত করা কিছুটা জটিল হয়ে পড়ে ...
আমি এই সঠিক কোডটি পরীক্ষা করেছি না, তবে আমি বড় আকারের কাস্টম পোস্ট টাইপ সেটআপগুলিতে যা করেছি তার একটি সরল সংস্করণ।
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);' ) );
}
}
}
একাধিক মেটাবক্স ক্ষেত্রের জন্য, কেবলমাত্র আরও সমাপ্তি চিহ্নিতকারী যুক্ত করুন এবং আরও পোস্ট_মেটা পুনরুদ্ধার করুন এবং আরও পরীক্ষা করুন ..