Source: my-calendar-event-posts.php

<?php
/**
 * Submit posts from events.
 *
 * @category Features
 * @package  My Calendar Pro
 * @author   Joe Dolson
 * @license  GPLv2 or later
 * @link     https://www.joedolson.com/my-calendar-pro/
 */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Create a post when an event is created.
 */

add_action( 'mc_update_event_post', 'my_event_post', 20, 5 );
/**
 * Save event data for post & create post.
 *
 * @param string  $event_post Event post ID.
 * @param array   $post Posted data.
 * @param array   $data Event data.
 * @param integer $new_event New Event ID.
 * @param string  $action Action being taken.
 */
function my_event_post( $event_post, $post, $data, $new_event, $action ) {
	if ( ! ( 'true' === get_option( 'mcs_create_post' ) ) ) {
		return;
	}
	// if the event save was successful.
	$options = get_option( 'mcs_event_post' );
	switch ( $options['content'] ) {
		case 'event':
			$content = "[my_calendar_event event='$new_event' template='details' list='']";
			break;
		case 'custom':
			$content = ( isset( $post['mcs_custom_content'] ) ) ? wp_kses_post( $post['mcs_custom_content'] ) : '';
			break;
		default:
			$content = $data['event_desc'];
			break;
	}
	$event   = mc_get_first_event( $new_event );
	$details = mc_create_tags( $event );
	if ( 'custom' === $options['content'] ) {
		$content = mc_draw_template( $details, apply_filters( 'mcs_new_post_template', $content, $event ) );
	}

	switch ( $options['title'] ) {
		case 'custom':
			$title = sprintf( $options['custom_title'], $data['event_title'] );
			$title = mc_draw_template( $details, $title );
			break;
		default:
			$title = $data['event_title'];
	}

	switch ( $options['author'] ) {
		case 'host':
			$auth = $data['event_host'];
			break;
		default:
			$auth = isset( $data['event_author'] ) ? $data['event_author'] : get_current_user_id();
	}

	switch ( $options['excerpt'] ) {
		case 'event_short':
			$excerpt = $data['event_short'];
			break;
		case 'auto':
			$excerpt = wp_trim_words( $data['event_desc'] );
			break;
		case 'custom':
			$excerpt = ( isset( $post['mcs_custom_content'] ) ) ? wp_kses_post( $post['mcs_custom_content'] ) : '';
			break;
		default:
			$excerpt = $data['event_short'];
	}

	if ( 'custom' === $options['excerpt'] ) {
		$excerpt = mc_draw_template( $details, apply_filters( 'mcs_new_post_template', $excerpt, $event ) );
	}

	$status = ( isset( $options['status'] ) ) ? $options['status'] : 'publish';

	switch ( $options['timestamp'] ) {
		case 'event':
			$date = strtotime( $data['event_begin'] . ' ' . $data['event_time'] );
			break;
		case 'custom':
			if ( intval( $options['custom_time'] ) < 0 ) {
				// if custom time is negative, subtract the absolute value from the event time.
				$date = strtotime( $data['event_begin'] . ' ' . $data['event_time'] ) - abs( intval( $options['custom_time'] ) );
			} else {
				// if custom time is postive, add the value to the event time.
				$date = strtotime( $data['event_begin'] . ' ' . $data['event_time'] ) + intval( $options['custom_time'] );
			}
			break;
		default:
			$date = current_time( 'timestamp' ); // phpcs:ignore WordPress.DateTime.CurrentTimeTimestamp.Requested
	}

	$type = ( isset( $options['post_type'] ) ) ? $options['post_type'] : 'post';

	if ( 'add' === $action && ! ( isset( $post['event_source'] ) && 'post' === $post['event_source'] ) ) {
		if ( $date > current_time( 'timestamp' ) && 'publish' === $status ) { // phpcs:ignore WordPress.DateTime.CurrentTimeTimestamp.Requested
			// Switch to future if this is to be published automatically. Otherwise, leave as draft.
			$status = 'future';
		}

		$my_post = array(
			'post_title'   => $title,
			'post_content' => $content,
			'post_excerpt' => $excerpt,
			'post_status'  => $status,
			'post_author'  => $auth,
			'post_name'    => sanitize_title( $title ),
			'post_date'    => gmdate( 'Y-m-d H:i:s', $date ),
			'post_type'    => $type,
		);

		$post_id = wp_insert_post( $my_post );
		// check POST data.
		$attachment_id = ( isset( $post['event_image_id'] ) && is_numeric( $post['event_image_id'] ) ) ? (int) $post['event_image_id'] : false;
		// check event object.
		if ( $attachment_id ) {
			set_post_thumbnail( $post_id, $attachment_id );
		}
		$category = mc_get_category_detail( $data['event_category'], 'category_name' );
		$taxonomy = ( isset( $options['custom_taxonomy'] ) && '' !== $options['custom_taxonomy'] ) ? $options['custom_taxonomy'] : 'category';
		wp_set_post_tags( $post_id, $category );
		wp_set_object_terms( $post_id, $category, $taxonomy );
		if ( isset( $options['custom_category'] ) && '' !== $options['custom_category'] ) {
			wp_set_object_terms( $post_id, $options['custom_category'], $taxonomy );
		}
		$mc_event_id = get_post_meta( $post_id, '_mc_event_id', true );
		if ( ! $mc_event_id ) {
			add_post_meta( $post_id, '_mc_event_id', $new_event );
		}

		add_post_meta( $event_post, '_mc_related_post', $post_id );
		/**
		 * Action when a My Calendar Pro blog post is created from an event.
		 *
		 * @hook mcp_post_published
		 *
		 * @param {int}    $post_id New post ID.
		 * @param {object} $event Event object.
		 */
		do_action( 'mcp_post_published', $post_id, $event );

		if ( 'publish' === $status ) {
			wp_publish_post( $post_id );
		}

		if ( 'true' === $options['custom_url'] && 'publish' === $status ) {
			mc_update_data( $new_event, 'event_link', get_permalink( $post_id ), '%s' );
		}
	}
}

add_filter( 'mcs_custom_settings_update', 'mcs_event_posts_update', 10, 2 );
/**
 * Update event posts settings.
 *
 * @param boolean $value Is updated.
 * @param array   $post POST data.
 *
 * @return string update info.
 */
function mcs_event_posts_update( $value, $post ) {
	// save settings.
	if ( isset( $post['event_posts_settings'] ) ) {
		$options = get_option( 'mcs_event_post' );
		if ( isset( $post['mcs_create_post'] ) ) {
			update_option( 'mcs_create_post', 'true' );
		} else {
			delete_option( 'mcs_create_post' );
		}
		$options['content']         = sanitize_textarea_field( $post['mcs_content'] );
		$options['title']           = sanitize_text_field( $post['mcs_title'] );
		$options['custom_title']    = sanitize_text_field( $post['mcs_custom_title'] );
		$options['custom_url']      = isset( $post['mcs_custom_url'] ) ? sanitize_text_field( $post['mcs_custom_url'] ) : '';
		$options['custom_category'] = isset( $post['mcs_custom_category'] ) ? sanitize_text_field( $post['mcs_custom_category'] ) : '';
		$options['custom_taxonomy'] = isset( $post['mcs_custom_taxonomy'] ) ? sanitize_text_field( $post['mcs_custom_taxonomy'] ) : '';
		$options['author']          = sanitize_text_field( $post['mcs_author'] );
		$options['excerpt']         = sanitize_textarea_field( $post['mcs_excerpt'] );
		$options['template']        = isset( $post['mcs_template'] ) ? sanitize_textarea_field( $post['mcs_template'] ) : '';
		$options['status']          = sanitize_text_field( $post['mcs_status'] );
		$options['timestamp']       = sanitize_text_field( $post['mcs_timestamp'] );
		$options['custom_time']     = isset( $post['mcs_custom_time'] ) ? sanitize_text_field( $post['mcs_custom_time'] ) : '';
		$options['type']            = sanitize_text_field( $post['mcs_type'] );
		update_option( 'mcs_event_post', $options );

		return __( 'Event Post Settings Updated', 'my-calendar-pro' );
	}

	return $value;
}

add_filter( 'mcs_settings_tabs', 'mcs_event_posts_tabs' );
/**
 * Set up settings tab for event posts.
 *
 * @param array $tabs All My Calendar pro tabs.
 *
 * @return array updated tabs.
 */
function mcs_event_posts_tabs( $tabs ) {
	$tabs['event_posts'] = __( 'Blog New Events', 'my-calendar-pro' );

	return $tabs;
}

add_filter( 'mcs_settings_panels', 'mcs_event_posts_settings' );
/**
 * Set up settings for event posts.
 *
 * @param array $panels All My Calendar pro panels.
 *
 * @return array updated panels.
 */
function mcs_event_posts_settings( $panels ) {
	$mcs_create_post     = get_option( 'mcs_create_post' );
	$options             = get_option(
		'mcs_event_post',
		array(
			'excerpt'         => '',
			'template'        => '',
			'custom_title'    => '',
			'custom_url'      => '',
			'custom_category' => '',
			'custom_taxonomy' => 'category',
			'custom_time'     => 3600,
			'content'         => '',
			'title'           => '',
			'author'          => '',
			'status'          => '',
			'timestamp'       => '',
			'type'            => '',
		)
	);
	$excerpt             = ( isset( $options['excerpt'] ) ) ? $options['excerpt'] : '';
	$mcs_template        = ( isset( $options['template'] ) ) ? $options['template'] : '';
	$mcs_custom_title    = ( isset( $options['custom_title'] ) ) ? $options['custom_title'] : 'New Event: %s';
	$mcs_custom_url      = ( isset( $options['custom_url'] ) ) ? $options['custom_url'] : 'false';
	$mcs_custom_category = ( isset( $options['custom_category'] ) ) ? $options['custom_category'] : '';
	$mcs_custom_taxonomy = ( isset( $options['custom_taxonomy'] ) ) ? $options['custom_taxonomy'] : '';
	$mcs_custom_time     = ( isset( $options['custom_time'] ) ) ? $options['custom_time'] : 3600;
	$diff                = human_time_diff( current_time( 'timestamp' ), current_time( 'timestamp' ) + (int) $mcs_custom_time ); // phpcs:ignore WordPress.DateTime.CurrentTimeTimestamp.Requested
	if ( $mcs_custom_time < 0 ) {
		// Translators: Time unit.
		$diff = sprintf( __( '<strong>%s</strong> before event happens', 'my-calendar-pro' ), $diff );
	} else {
		// Translators: Time unit.
		$diff = sprintf( __( '<strong>%s</strong> after event is published', 'my-calendar-pro' ), $diff );
	}

	if ( 'true' === $mcs_create_post ) {
		$post_types = get_post_types(
			array(
				'public'  => true,
				'show_ui' => true,
			),
			'objects'
		);
		$types      = '';
		$skip_types = array( 'mc-events', 'attachment', 'mc-locations' );
		foreach ( $post_types as $type ) {
			if ( in_array( $type->name, $skip_types, true ) ) {
				continue;
			}
			$types .= "<option value='$type->name'" . selected( $options['type'], $type->name, false ) . '>' . $type->labels->name . '</option>';
		}
		$post_taxonomies = get_taxonomies(
			array(
				'public' => true,
			),
			'objects'
		);
		$taxonomies      = '';
		foreach ( $post_taxonomies as $taxonomy ) {
			$tax   = $taxonomy->name;
			$label = $taxonomy->label;
			if ( 'mc-event-category' === $tax ) {
				continue;
			}
			$taxonomies .= "<option value='" . esc_attr( $tax ) . "'" . selected( $mcs_custom_taxonomy, $tax, false ) . '>' . $label . '</option>';
		}
		$controls = '
		<fieldset>
			<legend>' . __( 'Create Post from Events Settings', 'my-calendar-pro' ) . "</legend>
			<p>
				<label for='mcs_content'>" . __( 'Blog Post Content', 'my-calendar-pro' ) . "</label><br />
				<select name='mcs_content' id='mcs_content'>
					<option value='default'>" . __( 'Event Description', 'my-calendar-pro' ) . "</option>
					<option value='event'" . selected( $options['content'], 'event', false ) . '>' . __( 'Full Event Template', 'my-calendar-pro' ) . "</option>
					<option value='custom'" . selected( $options['content'], 'custom', false ) . '>' . __( 'Custom Content added at event creation', 'my-calendar-pro' ) . "</option>
				</select>
			</p>
			<p>
				<label for='mcs_excerpt'>" . __( 'Blog Post Excerpt', 'my-calendar-pro' ) . "</label><br />
				<select name='mcs_excerpt' id='mcs_excerpt'>
					<option value='default'>" . __( 'Event Excerpt', 'my-calendar-pro' ) . "</option>
					<option value='auto'" . selected( $excerpt, 'auto', false ) . '>' . __( 'Auto-excerpt Event Description', 'my-calendar-pro' ) . "</option>
					<option value='custom'" . selected( $excerpt, 'custom', false ) . '>' . __( 'Custom Content added at event creation', 'my-calendar-pro' ) . "</option>
				</select>
			</p>
			<p>
				<label for='mcs_title'>" . __( 'Blog Post Title', 'my-calendar-pro' ) . "</label><br />
				<select name='mcs_title' id='mcs_title'>
					<option value='default'>" . __( 'Event Title', 'my-calendar-pro' ) . "</option>
					<option value='custom'" . selected( $options['title'], 'custom', false ) . '>' . __( 'Custom Format', 'my-calendar-pro' ) . "</option>
				</select>
			</p>
			<p>
				<label for='mcs_custom_title'>" . __( 'Custom Title Format', 'my-calendar-pro' ) . "</label><br />
				<input type='text' name='mcs_custom_title' id='mcs_custom_title' value='" . esc_attr( stripslashes( $mcs_custom_title ) ) . "' />
			</p>
			<p>
				<label for='mcs_ep_template'>" . __( 'Custom Post Excerpt or Content Template', 'my-calendar-pro' ) . '</label><br />';
			// Translators: Link to template tag help.
			$note      = sprintf( __( 'Accepts <a href="%s">template tags</a>', 'my-calendar-pro' ), admin_url( 'admin.php?page=my-calendar-design#my-calendar-templates' ) );
			$controls .= "
				<textarea name='mcs_template' id='mcs_ep_template'  aria-describedby='mcs_template_note' rows='6' cols='60'>" . esc_attr( stripslashes( $mcs_template ) ) . "</textarea> <span id='mcs_template_note'>" . $note . "</span>
			</p>
			<p>
				<label for='mcs_author'>" . __( 'Blog Post Author', 'my-calendar-pro' ) . "</label><br />
				<select name='mcs_author' id='mcs_author'>
					<option value='default'>" . __( 'Event Author', 'my-calendar-pro' ) . "</option>
					<option value='host'" . selected( $options['author'], 'host', false ) . '>' . __( 'Event Host', 'my-calendar-pro' ) . "</option>
				</select>
			</p>
			<p>
				<label for='mcs_status'>" . __( 'Blog Post Status', 'my-calendar-pro' ) . "</label><br />
				<select name='mcs_status' id='mcs_status'>
					<option value='publish'>" . __( 'Published', 'my-calendar-pro' ) . "</option>
					<option value='pending'" . selected( $options['status'], 'pending', false ) . '>' . __( 'Pending', 'my-calendar-pro' ) . "</option>
					<option value='draft'" . selected( $options['status'], 'draft', false ) . '>' . __( 'Draft', 'my-calendar-pro' ) . "</option>
					<option value='private'" . selected( $options['status'], 'private', false ) . '>' . __( 'Private', 'my-calendar-pro' ) . "</option>
					<option value='future'" . selected( $options['status'], 'future', false ) . '>' . __( 'Future', 'my-calendar-pro' ) . "</option>
				</select>
			</p>
			<p class='checkbox'>
				<input type='checkbox' name='mcs_custom_url' id='mcs_custom_url' value='true' " . checked( $mcs_custom_url, 'true', false ) . " /> <label for='mcs_custom_url'>" . __( 'Use Post permalink for Event URL (if post is published)', 'my-calendar-pro' ) . "</label>
			</p>
			<p>
				<label for='mcs_type'>" . __( 'Post Type', 'my-calendar-pro' ) . "</label><br />
				<select name='mcs_type' id='mcs_type'>
					$types
				</select>
			</p>
			<fieldset>
				<legend>" . __( 'Categorize your event post', 'my-calendar-pro' ) . "</legend>
				<div class='mc-flex'>
				<p>
					<label for='mcs_custom_category'>" . __( 'Add Post Term', 'my-calendar-pro' ) . "</label><br />
					<input type='text' name='mcs_custom_category' id='mcs_custom_category' value='" . esc_attr( stripslashes( $mcs_custom_category ) ) . "' />
				</p>
				<p>
					<label for='mcs_custom_taxonomy'>" . __( 'Term Taxonomy', 'my-calendar-pro' ) . "</label><br />
					<select name='mcs_custom_taxonomy' id='mcs_custom_taxonomy'>
						$taxonomies
					</select>
				</p>
				</div>
			</fieldset>
			<fieldset>
				<legend>" . __( 'Set your post publication date', 'my-calendar-pro' ) . "</legend>
				<div class='mc-flex'>
				<p>
					<label for='mcs_timestamp'>" . __( 'Post Publish Date', 'my-calendar-pro' ) . "</label><br />
					<select name='mcs_timestamp' id='mcs_timestamp'>
						<option value='default'>" . __( 'Publication Date', 'my-calendar-pro' ) . "</option>
						<option value='event'" . selected( $options['timestamp'], 'event', false ) . '>' . __( 'Event Date', 'my-calendar-pro' ) . "</option>
						<option value='custom'" . selected( $options['timestamp'], 'custom', false ) . '>' . __( 'Custom Date', 'my-calendar-pro' ) . "</option>
					</select>
				</p>
				<p>
					<label for='mcs_custom_time'>" . __( 'Custom Post Time (in seconds)', 'my-calendar-pro' ) . "</label><br />
					<input type='text' name='mcs_custom_time' id='mcs_custom_time' value='" . esc_attr( $mcs_custom_time ) . "' aria-describedby='mcs_custom_time_diff' /> <span id='mcs_custom_time_diff'>$diff</span>
				</p>
				</div>
			</fieldset>
		</fieldset>
		";
	} else {
		$controls = "
		<div class='mcs-about'>
			<p>
				" . __( 'Set up a template and rules for automatically generating a blog post about new events.', 'my-calendar-pro' ) . "
			</p>
		</div>
		<div>
			<input type='hidden' name='mcs_content' value='" . esc_attr( $options['content'] ) . "' />
			<input type='hidden' name='mcs_excerpt' value='" . esc_attr( $options['excerpt'] ) . "' />
			<input type='hidden' name='mcs_title' value='" . esc_attr( $options['title'] ) . "' />
			<input type='hidden' name='mcs_custom_title' value='" . esc_attr( $mcs_custom_title ) . "' />
			<input type='hidden' name='mcs_author' value='" . esc_attr( $options['author'] ) . "' />
			<input type='hidden' name='mcs_status' value='" . esc_attr( $options['status'] ) . "' />
			<input type='hidden' name='mcs_timestamp' value='" . esc_attr( $options['timestamp'] ) . "' />
			<input type='hidden' name='mcs_custom_time' value='" . esc_attr( $mcs_custom_time ) . "' />
			<input type='hidden' name='mcs_type' value='" . esc_attr( $options['type'] ) . "' />
		</div>";
	}
	$panels['event_posts'] = '
		<h2>' . __( 'Post New Events as Posts', 'my-calendar-pro' ) . '</h2>
		<div class="inside">
			<p>
				<input type="checkbox" name="mcs_create_post" id="mcs_create_post" value="true" ' . checked( $mcs_create_post, 'true', false ) . '/> <label for="mcs_create_post">' . __( 'Copy new events as posts', 'my-calendar-pro' ) . '</label>
			</p>' . $controls . '
			{submit}
		</div>';

	return $panels;
}

add_filter( 'mc_event_details', 'mcs_custom_content', 10, 4 );
/**
 * Generate form within My Calendar submission forms to provide custom content for a blog post.
 *
 * @param string  $form Form HTML.
 * @param boolean $has_data Has data already.
 * @param object  $event Event object.
 * @param string  $context Current view context.
 *
 * @return string.
 */
function mcs_custom_content( $form, $has_data, $event, $context ) {
	if ( 'true' === get_option( 'mcs_create_post' ) ) {
		$options        = get_option( 'mcs_event_post' );
		$custom_content = $options['content'];
		$custom_excerpt = $options['excerpt'];
		$template       = ( isset( $options['template'] ) ) ? $options['template'] : '';
		$template       = apply_filters( 'mcs_custom_content_template', $template );

		if ( 'custom' === $custom_content xor 'custom' === $custom_excerpt ) {
			if ( ! ( is_object( $event ) && $has_data ) ) {
				$label = ( 'custom' === $custom_content ) ? __( 'Custom Content for Post', 'my-calendar-pro' ) : __( 'Custom Excerpt for Post', 'my-calendar-pro' );
				$form .= "<p><label for='mcs_custom_content'>" . $label . "</label><br /><textarea name='mcs_custom_content' id='mcs_custom_content' rows='8' cols='60' class='widefat' />" . esc_attr( $template ) . '</textarea></p>';
			}
		} elseif ( 'custom' === $custom_content && 'custom' === $custom_excerpt ) {
			$form .= "<div class='update error'><p>" . __( '<strong>Settings error:</strong> You can either create the post excerpt with custom content or the post content, but not both.', 'my-calendar-pro' ) . '</p></div>';
		}

		if ( is_object( $event ) && property_exists( $event, 'event_post' ) && $has_data ) {
			$related = get_post_meta( $event->event_post, '_mc_related_post', true );
			$url     = ( $related ) ? get_edit_post_link( $related ) : false;
			if ( $url ) {
				$form .= "<p><a href='$url'>" . __( 'Edit blog post associated with this event', 'my-calendar-pro' ) . '</a></p>';
			}
		}
	}

	return $form;
}

add_action( 'mc_update_event_post', 'mcs_custom_content_save', 10, 5 );
/**
 * Save custom content settings.
 *
 * @param int    $post_id Post ID.
 * @param array  $post POST data.
 * @param object $data Event data.
 * @param int    $event_id Event ID.
 * @param string $action Action taken.
 */
function mcs_custom_content_save( $post_id, $post, $data, $event_id, $action ) {
	if ( 'true' === get_option( 'mcs_create_post' ) ) {
		$options        = get_option( 'mcs_event_post' );
		$custom_content = $options['content'];
		if ( 'custom' === $custom_content ) {
			$content = isset( $post['mcs_custom_content'] ) ? sanitize_textarea_field( $post['mcs_custom_content'] ) : '';
			update_post_meta( $post_id, '_mc_custom_content', $content );
		}
	}
}