all-in-one-event-calendar/lib/post/custom-type.php
2017-11-09 17:36:04 +01:00

302 lines
12 KiB
PHP

<?php
/**
* Custom Post type class.
*
* @author Time.ly Network Inc.
* @since 2.0
*
* @package AI1EC
* @subpackage AI1EC.Post
*/
class Ai1ec_Post_Custom_Type extends Ai1ec_Base {
/**
* Registers the custom post type.
*
* @wp-hook init
*/
public function register() {
$settings = $this->_registry->get( 'model.settings' );
// ===============================
// = labels for custom post type =
// ===============================
$labels = array(
'name' => Ai1ec_I18n::_x( 'Events', 'Custom post type name' ),
'singular_name' => Ai1ec_I18n::_x( 'Event', 'Custom post type name (singular)' ),
'add_new' => Ai1ec_I18n::__( 'Add New' ),
'add_new_item' => Ai1ec_I18n::__( 'Add New Event' ),
'edit_item' => Ai1ec_I18n::__( 'Edit Event' ),
'new_item' => Ai1ec_I18n::__( 'New Event' ),
'view_item' => Ai1ec_I18n::__( 'View Event' ),
'search_items' => Ai1ec_I18n::__( 'Search Events' ),
'not_found' => Ai1ec_I18n::__( 'No Events found' ),
'not_found_in_trash' => Ai1ec_I18n::__( 'No Events found in Trash' ),
'parent_item_colon' => Ai1ec_I18n::__( 'Parent Event' ),
'menu_name' => Ai1ec_I18n::__( 'Events' ),
'all_items' => $this->get_all_items_name(),
);
// ================================
// = support for custom post type =
// ================================
$supports = array( 'title', 'editor', 'comments', 'custom-fields', 'thumbnail', 'author' );
// =============================
// = args for custom post type =
// =============================
$page_base = false;
if ( $settings->get( 'calendar_page_id' ) ) {
$page_base = get_page_uri( $settings->get( 'calendar_page_id' ) );
}
$rewrite = array( 'slug' => Ai1ec_I18n::__( 'event' ) );
$has_archive = true;
if (
$settings->get( 'calendar_base_url_for_permalinks' ) &&
$page_base
) {
$rewrite = array( 'slug' => $page_base );
$has_archive = AI1EC_ALTERNATIVE_ARCHIVE_URL;
}
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'rewrite' => $rewrite,
'map_meta_cap' => true,
'capability_type' => 'ai1ec_event',
'has_archive' => $has_archive,
'hierarchical' => false,
'menu_position' => 5,
'supports' => $supports,
'exclude_from_search' => $settings->get( 'exclude_from_search' ),
);
// ========================================
// = labels for event categories taxonomy =
// ========================================
$events_categories_labels = array(
'name' => Ai1ec_I18n::_x( 'Categories', 'Event categories taxonomy' ),
'singular_name' => Ai1ec_I18n::_x( 'Category', 'Event categories taxonomy (singular)' ),
'menu_name' => Ai1ec_I18n::_x( 'Organize', 'Event categories menu item' ),
);
// ==================================
// = labels for event tags taxonomy =
// ==================================
$events_tags_labels = array(
'name' => Ai1ec_I18n::_x( 'Tags', 'Event tags taxonomy' ),
'singular_name' => Ai1ec_I18n::_x( 'Tag', 'Event tags taxonomy (singular)' )
);
// ==================================
// = labels for event feeds taxonomy =
// ==================================
$events_feeds_labels = array(
'name' => Ai1ec_I18n::_x( 'Event Feeds', 'Event feeds taxonomy' ),
'singular_name' => Ai1ec_I18n::_x( 'Event Feed', 'Event feed taxonomy (singular)' )
);
// ======================================
// = args for event categories taxonomy =
// ======================================
$events_categories_args = array(
'labels' => $events_categories_labels,
'hierarchical' => true,
'rewrite' => array( 'slug' => 'events_categories' ),
'capabilities' => array(
'manage_terms' => 'manage_events_categories',
'edit_terms' => 'manage_events_categories',
'delete_terms' => 'manage_events_categories',
'assign_terms' => 'edit_ai1ec_events'
),
);
// ================================
// = args for event tags taxonomy =
// ================================
$events_tags_args = array(
'labels' => $events_tags_labels,
'hierarchical' => false,
'rewrite' => array( 'slug' => 'events_tags' ),
'show_ui' => true,
'capabilities' => array(
'manage_terms' => 'manage_events_categories',
'edit_terms' => 'manage_events_categories',
'delete_terms' => 'manage_events_categories',
'assign_terms' => 'edit_ai1ec_events'
),
);
// ================================
// = args for event feeds taxonomy =
// ================================
$events_feeds_args = array(
'labels' => $events_feeds_labels,
'hierarchical' => false,
'rewrite' => array( 'slug' => 'events_feeds' ),
'capabilities' => array(
'manage_terms' => 'manage_events_categories',
'edit_terms' => 'manage_events_categories',
'delete_terms' => 'manage_events_categories',
'assign_terms' => 'edit_ai1ec_events'
),
'public' => false // don't show taxonomy in admin UI
);
// ======================================
// = register event categories taxonomy =
// ======================================
register_taxonomy(
'events_categories',
array( AI1EC_POST_TYPE ),
$events_categories_args
);
// ================================
// = register event tags taxonomy =
// ================================
register_taxonomy(
'events_tags',
array( AI1EC_POST_TYPE ),
$events_tags_args
);
// ================================
// = register event tags taxonomy =
// ================================
register_taxonomy(
'events_feeds',
array( AI1EC_POST_TYPE ),
$events_feeds_args
);
// ========================================
// = register custom post type for events =
// ========================================
register_post_type( AI1EC_POST_TYPE, $args );
// get event contributor if saved in the db
$contributor = get_role( 'ai1ec_event_assistant' );
// if it's present and has the wrong capability delete it.
if (
$contributor instanceOf WP_Role &&
(
$contributor->has_cap( 'publish_ai1ec_events' ) ||
! $contributor->has_cap( 'edit_published_ai1ec_events' ) ||
! $contributor->has_cap( 'delete_published_ai1ec_events' )
)
) {
remove_role( 'ai1ec_event_assistant' );
$contributor = false;
}
// Create event contributor role with the same capabilities
// as subscriber role, plus event managing capabilities
// if we have not created it yet.
if ( ! $contributor ) {
$caps = get_role( 'subscriber' )->capabilities;
$role = add_role(
'ai1ec_event_assistant',
'Event Contributor',
$caps
);
$role->add_cap( 'edit_ai1ec_events' );
$role->add_cap( 'read_ai1ec_events' );
$role->add_cap( 'delete_ai1ec_events' );
$role->add_cap( 'edit_published_ai1ec_events' );
$role->add_cap( 'delete_published_ai1ec_events' );
$role->add_cap( 'read' );
unset( $caps, $role );
}
// Add event managing capabilities to administrator, editor, author.
// The last created capability is "manage_ai1ec_feeds", so check for
// that one.
$role = get_role( 'administrator' );
if ( is_object( $role ) && ! $role->has_cap( 'manage_ai1ec_feeds' ) ) {
$role_list = array( 'administrator', 'editor', 'author' );
foreach ( $role_list as $role_name ) {
$role = get_role( $role_name );
if ( null === $role || ! ( $role instanceof WP_Role ) ) {
continue;
}
// Read events.
$role->add_cap( 'read_ai1ec_event' );
// Edit events.
$role->add_cap( 'edit_ai1ec_event' );
$role->add_cap( 'edit_ai1ec_events' );
$role->add_cap( 'edit_private_ai1ec_events' );
$role->add_cap( 'edit_published_ai1ec_events' );
// Delete events.
$role->add_cap( 'delete_ai1ec_event' );
$role->add_cap( 'delete_ai1ec_events' );
$role->add_cap( 'delete_published_ai1ec_events' );
$role->add_cap( 'delete_private_ai1ec_events' );
// Publish events.
$role->add_cap( 'publish_ai1ec_events' );
// Read private events.
$role->add_cap( 'read_private_ai1ec_events' );
// Manage categories & tags.
$role->add_cap( 'manage_events_categories' );
// Manage calendar feeds.
$role->add_cap( 'manage_ai1ec_feeds' );
if ( 'administrator' === $role_name ) {
// Change calendar themes & manage calendar options.
$role->add_cap( 'switch_ai1ec_themes' );
$role->add_cap( 'manage_ai1ec_options' );
}
// Add additional roles for administrator and editor
if ( 'author' !== $role_name ) {
$role->add_cap( 'edit_others_ai1ec_events' );
$role->add_cap( 'delete_others_ai1ec_events' );
}
}
}
}
/**
* Appending pending items number to the menu name.
*
* If current user can publish events and there
* is at least 1 event pending, append the pending
* events number to the menu
*
* @return string
*/
public function get_all_items_name() {
// if current user can publish events
if ( current_user_can( 'publish_ai1ec_events' ) ) {
// get all pending events
$query = array (
'post_type' => AI1EC_POST_TYPE,
'post_status' => 'pending',
'posts_per_page' => -1,
);
$query = new WP_Query( $query );
// at least 1 pending event?
if ( $query->post_count > 0 ) {
// append the pending events number to the menu
return sprintf(
Ai1ec_I18n::__(
'All Events <span class="update-plugins count-%d" title="%d Pending Events"><span class="update-count">%d</span></span>'
),
$query->post_count,
$query->post_count,
$query->post_count
);
}
}
// no pending events, or the user doesn't have sufficient capabilities
return Ai1ec_I18n::__( 'All Events' );
}
}