আমার একটি কাস্টম পোস্ট টাইপ Event
রয়েছে যার মধ্যে একটি প্রারম্ভিক এবং শেষের তারিখ / বার কাস্টম ক্ষেত্র রয়েছে (পোস্ট সম্পাদনা পর্দার মেটাবক্স হিসাবে)।
আমি নিশ্চিত করতে চাই যে তারিখগুলি পূরণ না করে কোনও ইভেন্ট প্রকাশিত (বা নির্ধারিত) হতে পারে না, কারণ এটি ইভেন্টের ডেটা প্রদর্শনকারী টেমপ্লেটগুলিতে সমস্যা সৃষ্টি করবে (এটি একটি প্রয়োজনীয় প্রয়োজনীয়তা ছাড়াও!)! তবে আমি খসড়া ইভেন্টগুলি প্রস্তুত করতে সক্ষম হতে চাই যেগুলি প্রস্তুতির সময় কোনও বৈধ তারিখ ধারণ করে না।
আমি save_post
চেকিং করতে হুকিংয়ের কথা ভাবছিলাম , তবে আমি কীভাবে স্থিতি পরিবর্তনটি রোধ করতে পারি?
সম্পাদনা 1: পোস্ট_মেটা সংরক্ষণ করার জন্য আমি এখন এটি ব্যবহার করছি h
// Save the Metabox Data
function ep_eventposts_save_meta( $post_id, $post ) {
if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
return;
if ( !isset( $_POST['ep_eventposts_nonce'] ) )
return;
if ( !wp_verify_nonce( $_POST['ep_eventposts_nonce'], plugin_basename( __FILE__ ) ) )
return;
// Is the user allowed to edit the post or page?
if ( !current_user_can( 'edit_post', $post->ID ) )
return;
// OK, we're authenticated: we need to find and save the data
// We'll put it into an array to make it easier to loop though
//debug
//print_r($_POST);
$metabox_ids = array( '_start', '_end' );
foreach ($metabox_ids as $key ) {
$events_meta[$key . '_date'] = $_POST[$key . '_date'];
$events_meta[$key . '_time'] = $_POST[$key . '_time'];
$events_meta[$key . '_timestamp'] = $events_meta[$key . '_date'] . ' ' . $events_meta[$key . '_time'];
}
$events_meta['_location'] = $_POST['_location'];
if (array_key_exists('_end_timestamp', $_POST))
$events_meta['_all_day'] = $_POST['_all_day'];
// Add values of $events_meta as custom fields
foreach ( $events_meta as $key => $value ) { // Cycle through the $events_meta array!
if ( $post->post_type == 'revision' ) return; // Don't store custom data twice
$value = implode( ',', (array)$value ); // If $value is an array, make it a CSV (unlikely)
if ( get_post_meta( $post->ID, $key, FALSE ) ) { // If the custom field already has a value
update_post_meta( $post->ID, $key, $value );
} else { // If the custom field doesn't have a value
add_post_meta( $post->ID, $key, $value );
}
if ( !$value )
delete_post_meta( $post->ID, $key ); // Delete if blank
}
}
add_action( 'save_post', 'ep_eventposts_save_meta', 1, 2 );
সম্পাদনা 2: এবং এটিই আমি ডাটাবেজে সংরক্ষণের পরে পোস্ট ডেটা পরীক্ষা করার জন্য ব্যবহার করার চেষ্টা করছি।
add_action( 'save_post', 'ep_eventposts_check_meta', 99, 2 );
function ep_eventposts_check_meta( $post_id, $post ) {
//check that metadata is complete when a post is published
//print_r($_POST);
if ( $_POST['post_status'] == 'publish' ) {
$custom = get_post_custom($post_id);
//make sure both dates are filled
if ( !array_key_exists('_start_timestamp', $custom ) || !array_key_exists('_end_timestamp', $custom )) {
$post->post_status = 'draft';
wp_update_post($post);
}
//make sure start < end
elseif ( $custom['_start_timestamp'] > $custom['_end_timestamp'] ) {
$post->post_status = 'draft';
wp_update_post($post);
}
else {
return;
}
}
}
এটির সাথে মুখ্য সমস্যাটি এমন একটি সমস্যা যা আসলে অন্য একটি প্রশ্নে বর্ণিত হয়েছিল : wp_update_post()
একটি save_post
হুকের মধ্যে ব্যবহার করা অসীম লুপকে ট্রিগার করে।
সম্পাদনা 3:wp_insert_post_data
পরিবর্তে হুক করে আমি এটি করার একটি উপায় অনুভব করেছি save_post
। একমাত্র সমস্যাটি হ'ল এখন post_status
ফেরত দেওয়া হয়েছে তবে এখন "পোস্ট প্রকাশিত" বলে একটি বিভ্রান্তিমূলক বার্তা প্রদর্শিত হবে ( &message=6
পুনঃনির্দেশিত ইউআরএল যোগ করে) তবে স্থিতিটি খসড়াতে সেট করা আছে।
add_filter( 'wp_insert_post_data', 'ep_eventposts_check_meta', 99, 2 );
function ep_eventposts_check_meta( $data, $postarr ) {
//check that metadata is complete when a post is published, otherwise revert to draft
if ( $data['post_type'] != 'event' ) {
return $data;
}
if ( $postarr['post_status'] == 'publish' ) {
$custom = get_post_custom($postarr['ID']);
//make sure both dates are filled
if ( !array_key_exists('_start_timestamp', $custom ) || !array_key_exists('_end_timestamp', $custom )) {
$data['post_status'] = 'draft';
}
//make sure start < end
elseif ( $custom['_start_timestamp'] > $custom['_end_timestamp'] ) {
$data['post_status'] = 'draft';
}
//everything fine!
else {
return $data;
}
}
return $data;
}