Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

I am using The Events Calendar and (correct me if I'm wrong) there is no checking to see if an event has a time conflict with another event that's already been entered. For example, if there is already an event with a certain start time in a category, there cannot be another event posted with the same start time and in the same category. That would be a conflict.

Is there any way I can check values in the database for start time and category when the event post is submitted, and if both those values already exist for a post, kick the user back to the Add Event page?

EDIT: Here is what I am attempting to use in the functions.php file as the original save_post hook:

add_action('save_post', 'nu_time_conflict');

function nu_time_conflict($post_id) {
    $prevent_publish = NULL;
    if (isset($_REQUEST['EventStartDate']) && isset($_REQUEST['EventStartHour']) && isset($_REQUEST['EventStartMinute'])) {
            $start_date = date( TribeDateUtils::DBDATETIMEFORMAT, strtotime($_REQUEST['EventStartDate'] . " " . $_REQUEST['EventStartHour'] . ":" . $_REQUEST['EventStartMinute'] . ":00") );
    } else {
        die('Ingen datum valde.');
    }
    if (isset($_REQUEST['EventEndDate']) && isset($_REQUEST['EventEndHour']) && isset($_REQUEST['EventEndMinute'])) {
            $end_date = date( TribeDateUtils::DBDATETIMEFORMAT, strtotime($_REQUEST['EventEndDate'] . " " . $_REQUEST['EventEndHour'] . ":" . $_REQUEST['EventEndMinute'] . ":59") );
    } else {
        die('Ingen datum valde.');;
    }
    //Query post type 'tribe_events' to check for posts whose meta values match the POSTed ones
    $args = array(
      'post__not_in'=> array($post_id),
      'post_type' => 'tribe_events',
      'post_status' => array('publish','pending','future','private'),
      'meta_query' => array(
          'relation' => 'OR',
          array(
            'key' => 'EventStartDate',
            'value' => array(strtotime($start_date),strtotime($end_date)),
            'compare' => 'BETWEEN'
          ),
          array(
            'key' => 'EventEndDate',
            'value' => array(strtotime($start_date),strtotime($end_date)),
            'compare' => 'BETWEEN'
          )
      )
    );
    $existingMeta = get_posts( $args );

    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
     return;

    if(empty($existingMeta)){
        remove_action('save_post', 'nu_time_conflict');
        wp_update_post(array('ID' => $post_id, 'post_status' => 'pending')); 

        $current_user = wp_get_current_user();

        $user_mail = $current_user->user_email;
        $admin_email = get_option('admin_email');
        $type = get_post_type( $post_id );

        if (( !wp_is_post_revision( $post_id )) && ($type = 'tribe_events' )) {

                    $to = array($user_mail, $admin_email);
                    $subject = 'Ny bokning';
                    $message = $current_user->user_firstname.' '.$current_user->user_lastname.' har skapat en ny bokning.<br>';
                    $message .= 'För att redigera gå in på ' .get_permalink($post_id).'<br><br>';
                    $message .= '<em><small>OBS! Bokningen är inte giltig utan att bli bekräftad av administratören.</small></em>';
                    wp_mail($to, $subject, $message );
            }


        add_action('save_post', 'nu_time_conflict');
        $prevent_publish = FALSE;
    } else {
       $prevent_publish = TRUE;  
    }

    if ($prevent_publish) {
            remove_action('save_post', 'nu_time_conflict');
            wp_update_post(array('ID' => $post_id, 'post_status' => 'draft'));
            add_action('save_post', 'nu_time_conflict');
        }

    }

And here would be my redirect and custom message:

add_filter('redirect_post_location','nu_redirect_location',10,2);

    function nu_redirect_location($location,$post_id){
        if (isset($_POST['publish'])) {
            $status = get_post_status( $post_id );

            if($status=='draft'){
                $location = add_query_arg('message', 10, $location);
        }
        }
        return $location;
    }

        add_filter('post_updated_messages', 'nu_custom_messages');

        function nu_custom_messages($messages){

            $messages['tribe_events'][10] = 'Den valda tiden är inte tillgänglig. Välj ny tid';

          return $messages;
        }

It either isn't doing the comparison to check if those dates exist, or there is something wrong with my IF statement. It thinks all entries are valid and sends emails, and I am purposefully putting wrong ones in. So the posts aren't being marked as drafts, and the message is the one for a successful post. (The emails are also sent when the page is loaded, before any data is sent. What is with that? Should I not be using save_post?)

Any help is greatly appreciated. Since The Events Calendar has no availability function as far as I can tell, getting this to work would be perfect.

share|improve this question

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Browse other questions tagged or ask your own question.