Q1 I am trying to create post expiry on post types after they are published. What is the best way to do it? Can I use the post expiration feature without CRED?
Q2 I am using the following code if I use the CRED but the problem is publication date is not always today (we want to change the publication date) How can I add publication date selection on CRED?
function my_custom_expire_actions($custom_actions, $post_id, $form_data) {
$custom_actions[] = array( 'meta_key' => 'wpcf-membership-type', 'meta_value' => 'Charter' );
return $custom_actions;
}
add_filter('cred_post_expiration_custom_actions', 'my_custom_expire_actions', 10, 3);
add_action('cred_save_data', 'my_save_data_action',10,2);
function my_save_data_action($post_id, $form_data)
{
// if a specific form
if ($form_data['id']==35927)
{
$timestamp = get_post_meta($post_id, 'wpcf-user-note-publication-date', true);
$date = date('Y-m-d H:i:s', $timestamp);
if(isset($timestamp)){
$args = array(
'ID' => $post_id,
'post_date' => $date,
'post_status' => 'future'
);
wp_update_post( $args );
}
}
}
I used the code above but the status is still "published" even the date is in future.
Please see the attached image
Additional details:
the information in database is correct but the post doesnt go to wordpress admin
Update:
Was able to add publication date in CRED with this code:
add_action('cred_save_data_35927', 'set_future_post_35927', 10, 2);
function set_future_post_35927($post_id, $form_data)
{
$post_date1 = $_POST['wpcf-user-note-publication-date']['datepicker'];
//$hours = $_POST['wpcf-user-note-publication-date']['hour'];
// $hour = 6;
//$mins = $_POST['wpcf-user-note-publication-date']['minute'];
// $min = 0;
$postfinaltime = $post_date1 + $hour + $min;
$post_date = date("Y-m-d H:i:s", $postfinaltime);
$gmt_date = gmdate("Y-m-d H:i:s", $postfinaltime);
if ($post_date1){
$my_post = array(
'ID' => $post_id,
'post_status' => 'future',
'post_date' => $post_date, // Any future date having format 'Y-m-d H:i:s'
'post_date_gmt' => $gmt_date,
'edit_date' => true
);
// Update the post into the database
wp_update_post( $my_post );
}
}
Q1: How can I set time to 6:00 AM?
The following code works but does not follow the publication date set on the above code, it follows the date today. For example, I set the post expiry to change fields on 5 minutes, even if the post is scheduled for another date it follows the date today and expires in 5 minutes after the post is added.
function my_custom_expire_actions($custom_actions, $post_id, $form_data) {
$custom_actions[] = array( 'meta_key' => 'wpcf-membership-type', 'meta_value' => 'Charter' );
return $custom_actions;
}
add_filter('cred_post_expiration_custom_actions', 'my_custom_expire_actions', 10, 3);
Q2: How can I set the default time of post expiry function to publication date not the date today?
Q1: How can I set time to 6:00 AM?
The basic datepicker creates timestamps at 12:00 AM GMT. If you want to add 6 hours to this timestamp, you must add the number of seconds in 6 hours: 6hrs * 60mins * 60secs = 21600.
$post_date1 = $_POST['wpcf-user-note-publication-date']['datepicker'];
$post_date_6am = $post_date1 + ( 6 * 60 * 60 );
Q2: How can I set the default time of post expiry function to publication date not the date today?
In your cred_save_data hook, you can set the expiration date manually like this:
// modify the automated expiration date to use custom expiry date
$expiry_date = $timestamp; // change this to be a timestamp for expiration, GMT
update_post_meta($post_id, '_cred_post_expiration_time', $expiry_date );
}
}
Hi Christian,
Thank you, but I think I am not clear with my 2nd question. I have no problem setting time of post expiry but with the publication date/date added of the post.
For example, I set the expiry to a (1) day. I added a post today but it is scheduled for tomorrow. The post will still expire tomorrow. It doesn't follow the publication date, it follows the date it was added.
There is currently no built-in way to modify the post publish date of a new post created with Forms. It must be modified using custom code. For example, you could add a generic date field to the Form, then use the cred_save_data hook to modify the post_date and expiration date based on that selected publish date.
add_action('cred_save_data', 'my_save_data_action',10,2);
function my_save_data_action($post_id, $form_data)
{
// update post publish date based on generic date field
$timestamp = $_POST['date-field-slug']['timestamp'];
$date = date('Y-m-d H:i:s', $timestamp);
if(isset($timestamp)){
$args = array(
'ID' => $post_id,
'post_date' => $date
);
wp_update_post( $args );
// update post expiration date based on generic date field and time calculation
$expiry_timestamp = $timestamp + ( 6 * 60 * 60 );
update_post_meta($post_id, '_cred_post_expiration_time', $expiry_timestamp );
}
}
Hi,
I was able to make your function and my previous 2 functions work together.
How can I set the expiration date automatic to 30 days after set (future) publication date?
Thank you!
Hi again,
After testing for more example, I got an error. Please see my process below:
I am using:
add_action('cred_save_data_35927', 'set_future_post', 10, 2);
function set_future_post($post_id, $form_data)
{
$post_date1 = $_POST['wpcf-user-note-publication-date']['datepicker'];
$hours = $_POST['wpcf-user-note-publication-date']['hour'];
$hour = $hours * 600;
$mins = $_POST['wpcf-user-note-publication-date']['minute'];
$min = $mins * 60;
$postfinaltime = $post_date1 + $hour + $min;
$post_date = date("Y-m-d H:i:s", $postfinaltime);
$gmt_date = gmdate("Y-m-d H:i:s", $postfinaltime);
if ($post_date1){
$my_post = array(
'ID' => $post_id,
'post_status' => 'future',
'post_date' => $post_date, // Any future date having format 'Y-m-d H:i:s'
'post_date_gmt' => $gmt_date,
'edit_date' => true
);
// Update the post into the database
wp_update_post( $my_post );
}
}
-----
add_action('cred_save_data_35927', 'set_expiration_date',10,2);
function set_expiration_date($post_id, $form_data)
{
// update post publish date based on generic date field
$timestamp = $_POST['wpcf-user-note-expiration-date']['datepicker'];
$date = date('Y-m-d H:i:s', $timestamp);
if(isset($timestamp)){
$args = array(
'ID' => $post_id,
);
wp_update_post( $args );
// update post expiration date based on generic date field and time calculation
$expiry_timestamp = $timestamp + ( 6 * 60 * 60 );
update_post_meta($post_id, '_cred_post_expiration_time', $expiry_timestamp );
}
}
And deactivated the expiry settings on the CRED because it doesn't save the expiration date I set in the function.
The problem is how can I make the following code work without activating the post expiry settings on CRED?
function my_custom_expire_actions($custom_actions, $post_id, $form_data) {
if ($form_data['id']== 35927){
$custom_actions[] = array( 'meta_key' => 'wpcf-membership-type', 'meta_value' => 'Charter' );
return $custom_actions;
}
}
add_filter('cred_post_expiration_custom_actions', 'my_custom_expire_actions', 10, 3);
Coz right now it doesn't seem to work.
The cred_post_expiration_custom_actions hook will not get triggered on future Form submissions if you turn off custom expiration on the Form, so you must leave it active. There's not a good way to programmatically set custom expiration actions outside of this hook, because the action information is serialized in the database. Are you saying that leaving the expiration action active on the Form is causing a problem with the custom expiration actions on the custom expiration date/time?
Hi, I'm still testing. I'll update you back. Thank you.
That sounds good, thanks. I'll stand by for your update.
Hi Christian,
Thanks for waiting.
If the "Set expiration date for post created or edited by this form" is checked this code doesn't work:
add_action('cred_save_data_35927', 'set_expiration_date',10,2);
function set_expiration_date($post_id, $form_data)
{
// update post publish date based on generic date field
$timestamp = $_POST['wpcf-user-note-expiration-date']['datepicker'];
$date = date('Y-m-d H:i:s', $timestamp);
if(isset($timestamp)){
$args = array(
'ID' => $post_id,
);
wp_update_post( $args );
// update post expiration date based on generic date field and time calculation
$expiry_timestamp = $timestamp + ( 6 * 60 * 60 );
update_post_meta($post_id, '_cred_post_expiration_time', $expiry_timestamp );
}
}
If the "Set expiration date for post created or edited by this form" is unchecked this code doesn't work:
function my_custom_expire_actions($custom_actions, $post_id, $form_data) {
if ($form_data['id']== 35927){
$custom_actions[] = array( 'meta_key' => 'wpcf-membership-type', 'meta_value' => 'Charter' );
return $custom_actions;
}
}
add_filter('cred_post_expiration_custom_actions', 'my_custom_expire_actions', 10, 3);
Also, the code above doesn't follow the publication date or the expiration date but the date post added, it is always the date today. Even if the post date is in future, it will still follow the date post is added and count from that instead of the date specified.
If the "Set expiration date for post created or edited by this form" is checked this code doesn't work
Please remove the Form ID reference from the cred_save_data_35927 hook name. There is a quirk in the CRED API system that triggers specific Form hooks before some meta values are finalized, and it appears post expiration is one of those values. The cred_save_data hook is triggered a bit later in the request lifecycle, and will be able to override that value. Test the form ID in the callback instead, like this:
add_action('cred_save_data', 'set_expiration_date',10,2);
function set_expiration_date($post_id, $form_data)
{
$forms = array( 35927 );
if (in_array($form_data['id'], $forms)) {
// update post publish date based on generic date field
$timestamp = $_POST['wpcf-user-note-expiration-date']['datepicker'];
$date = date('Y-m-d H:i:s', $timestamp);
if(isset($timestamp)){
$args = array(
'ID' => $post_id,
);
wp_update_post( $args );
// update post expiration date based on generic date field and time calculation
$expiry_timestamp = $timestamp + ( 6 * 60 * 60 );
update_post_meta($post_id, '_cred_post_expiration_time', $expiry_timestamp );
}
}
}
Also, the code above doesn't follow the publication date or the expiration date but the date post added, it is always the date today
If you're referring to the custom expiration time, I think changing the cred_save_data hook name will resolve this problem. The code I provided is based on the date selected in the user-note-expiration-date custom field, not based on the current date. If the custom expiration time is not calculated correctly, there must be a problem getting the value from the custom field. Please copy + paste the code you have used to insert this generic field into your Form.
Hi again,
Still it is not working if the checkbox on post form expiration is <b>checked</b>
[credform class='cred-form cred-keep-original']
[cred_field field='form_messages' value='' class='alert alert-warning']
Publication: [cred_field field='note-publication-date' value='' urlparam='' class='form-control' output='bootstrap']
Expiration: [cred_field field='note-expiration-date' value='' urlparam='' class='form-control' output='bootstrap']
<div class="form-group">
<label>Title</label>
[cred_field field='post_title' value='' urlparam='' class='form-control' output='bootstrap']
</div>
<div class="form-group">
<label>Content</label>
[cred_field field='post_content' value='' urlparam='' output='bootstrap']
</div>
<div class="form-group" style="display:none;">
<label>Note User</label>
[cred_field field='note-user' value='[wpv-user field="user_login"]' urlparam='' class='form-control' output='bootstrap' type='hidden']
</div>
[cred_field field='form_submit' value='Submit' urlparam='' class='btn btn-primary btn-lg' output='bootstrap']
[/credform]