Add video_gallery.php
This commit is contained in:
commit
8e2f3e4430
1 changed files with 533 additions and 0 deletions
533
video_gallery.php
Normal file
533
video_gallery.php
Normal file
|
@ -0,0 +1,533 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Plugin Name: PeerTube Video Gallery
|
||||
* Description: A plugin to display a video gallery with categories visible to certain user groups.
|
||||
* Version: 0.1
|
||||
* Author: Hannah L (@hannah:private.coffee)
|
||||
* License: MIT
|
||||
*/
|
||||
|
||||
// Make sure we don't expose any info if called directly
|
||||
if (!function_exists('add_action')) {
|
||||
echo 'Hi there! I\'m just a plugin, not much I can do when called directly.';
|
||||
exit;
|
||||
}
|
||||
|
||||
// Register Custom Post Type for our Video Gallery
|
||||
function register_video_gallery_cpt()
|
||||
{
|
||||
$args = array(
|
||||
'public' => true,
|
||||
'label' => 'Video',
|
||||
'supports' => array('title', 'editor', 'thumbnail'),
|
||||
'menu_icon' => 'dashicons-video-alt3',
|
||||
);
|
||||
|
||||
register_post_type('video_gallery', $args);
|
||||
}
|
||||
|
||||
add_action('init', 'register_video_gallery_cpt');
|
||||
|
||||
// Register Custom Taxonomies for Video Categories and User Groups
|
||||
function register_video_gallery_taxonomies()
|
||||
{
|
||||
// Video Categories
|
||||
$labels = array(
|
||||
'name' => 'Video Categories',
|
||||
'singular_name' => 'Video Category',
|
||||
);
|
||||
|
||||
$args = array(
|
||||
'hierarchical' => true,
|
||||
'labels' => $labels,
|
||||
);
|
||||
|
||||
register_taxonomy('video_category', array('video_gallery'), $args);
|
||||
|
||||
// User Groups
|
||||
$labels = array(
|
||||
'name' => 'User Groups',
|
||||
'singular_name' => 'User Group',
|
||||
);
|
||||
|
||||
$args = array(
|
||||
'labels' => $labels,
|
||||
// 'public' and 'show_ui' are false to hide from admin menu as we'll create custom management
|
||||
'public' => false,
|
||||
'show_ui' => false,
|
||||
'rewrite' => false,
|
||||
'hierarchical' => true,
|
||||
);
|
||||
|
||||
register_taxonomy('user_group', 'user', $args);
|
||||
}
|
||||
|
||||
add_action('init', 'register_video_gallery_taxonomies', 0);
|
||||
|
||||
// Function to embed PeerTube video
|
||||
function output_video_html($video_post_id)
|
||||
{
|
||||
$video_html = get_post_meta($video_post_id, 'video_embed_html', true);
|
||||
// Safety filter for executing HTML content on the page.
|
||||
$video_html = wp_kses_post($video_html);
|
||||
|
||||
// Warn if the video embed code is empty
|
||||
if (empty($video_html)) {
|
||||
$video_html = '<p class="warning">No video embed code found.</p>';
|
||||
}
|
||||
|
||||
return $video_html;
|
||||
}
|
||||
|
||||
// Function to display user groups admin page in the admin menu
|
||||
function user_groups_admin_submenu()
|
||||
{
|
||||
add_submenu_page(
|
||||
'edit.php?post_type=video_gallery', // Parent slug
|
||||
__('Manage User Groups', 'text-domain'), // Page title
|
||||
__('User Groups', 'text-domain'), // Menu title
|
||||
'manage_options', // Capability required
|
||||
'manage-user-groups', // Menu slug
|
||||
'user_groups_admin_page' // Callback function
|
||||
);
|
||||
}
|
||||
|
||||
add_action('admin_menu', 'user_groups_admin_submenu');
|
||||
|
||||
|
||||
// Function to display user groups admin page
|
||||
function user_groups_admin_page()
|
||||
{
|
||||
// Ensure user has the capability to manage options
|
||||
if (!current_user_can('manage_options')) return;
|
||||
|
||||
if (isset($_POST['action']) && $_POST['action'] == 'add_user_group') {
|
||||
// Check for nonces and user capabilities if necessary
|
||||
$new_group_name = sanitize_text_field($_POST['user_group_name']);
|
||||
wp_insert_term($new_group_name, 'user_group');
|
||||
}
|
||||
|
||||
if (isset($_GET['delete_user_group'])) {
|
||||
$term_id = intval($_GET['delete_user_group']);
|
||||
wp_delete_term($term_id, 'user_group');
|
||||
}
|
||||
|
||||
// List user groups
|
||||
$user_groups = get_terms(array('taxonomy' => 'user_group', 'hide_empty' => false));
|
||||
?>
|
||||
<div class="wrap">
|
||||
<h1><?php _e('Manage User Groups', 'text-domain'); ?></h1>
|
||||
<form method="post">
|
||||
<?php wp_nonce_field('add_user_group_nonce', 'add_user_group_nonce_field'); ?>
|
||||
<input type="text" name="user_group_name" />
|
||||
<input type="submit" value="<?php _e('Add New User Group', 'text-domain'); ?>">
|
||||
<input type="hidden" name="action" value="add_user_group">
|
||||
</form>
|
||||
<ul>
|
||||
<?php foreach ($user_groups as $group) : ?>
|
||||
<li>
|
||||
<?php echo $group->name; ?>
|
||||
<a href="<?php echo esc_url(add_query_arg('delete_user_group', $group->term_id)); ?>" class="delete-user-group"><?php _e('Delete', 'text-domain'); ?></a>
|
||||
</li>
|
||||
<?php endforeach; ?>
|
||||
</ul>
|
||||
</div>
|
||||
<?php
|
||||
wp_enqueue_script('my-custom-script', plugin_dir_url(__FILE__) . 'js/my-custom-script.js', array('jquery'), null, true);
|
||||
}
|
||||
|
||||
// Add user groups to user profile
|
||||
function custom_user_group_profile_fields($user)
|
||||
{
|
||||
// Check for user capabilities
|
||||
if (!current_user_can('assign_user_groups')) return;
|
||||
|
||||
// Get all the available user groups
|
||||
$groups = get_terms('user_group', array('hide_empty' => false));
|
||||
|
||||
// If there is a WP_Error, let's log it and return early
|
||||
if (is_wp_error($groups)) {
|
||||
error_log('Failed to get user groups: ' . $groups->get_error_message());
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the user's saved group
|
||||
$user_groups = get_user_meta($user->ID, 'user_groups', true);
|
||||
|
||||
if (!is_array($user_groups)) {
|
||||
$user_groups = array($user_groups); // Ensure $user_groups is always an array
|
||||
}
|
||||
|
||||
// Debugging
|
||||
error_log('User Groups: ' . print_r($user_groups, true));
|
||||
|
||||
?>
|
||||
<h3><?php esc_html_e('User Groups', 'text-domain'); ?></h3>
|
||||
<table class="form-table">
|
||||
<tr>
|
||||
<th><label for="user_groups"><?php esc_html_e('Groups', 'text-domain'); ?></label></th>
|
||||
<td>
|
||||
<?php
|
||||
// Get all the available user groups
|
||||
$groups = get_terms('user_group', array('hide_empty' => false));
|
||||
?>
|
||||
<select multiple name="user_groups[]" id="user_groups" style="width:100%;max-width:25em;">
|
||||
<?php foreach ($groups as $group) : ?>
|
||||
<option value="<?php echo esc_attr($group->term_id); ?>" <?php if (in_array($group->term_id, $user_groups)) echo 'selected="selected"'; ?>>
|
||||
<?php echo esc_html($group->name); ?>
|
||||
</option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<span class="description"><?php esc_html_e('Select the user group.', 'text-domain'); ?></span>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
<?php
|
||||
}
|
||||
|
||||
add_action('show_user_profile', 'custom_user_group_profile_fields');
|
||||
add_action('edit_user_profile', 'custom_user_group_profile_fields');
|
||||
|
||||
|
||||
// Function to add user groups to user profile
|
||||
function save_user_groups($user_id)
|
||||
{
|
||||
// Assume that the form will send an array of group IDs named 'user_groups'
|
||||
if (isset($_POST['user_groups'])) {
|
||||
$user_groups = array_map('sanitize_text_field', $_POST['user_groups']);
|
||||
update_user_meta($user_id, 'user_groups', $user_groups);
|
||||
}
|
||||
}
|
||||
|
||||
add_action('personal_options_update', 'save_user_groups');
|
||||
add_action('edit_user_profile_update', 'save_user_groups');
|
||||
|
||||
function video_category_add_group_field()
|
||||
{
|
||||
// This function generates the form fields for adding a new video category
|
||||
?>
|
||||
<div class="form-field">
|
||||
<label for="video-category-group"><?php _e('User Groups Access', 'text-domain'); ?></label>
|
||||
<select name="video_category_group[]" id="video-category-group" multiple>
|
||||
<?php
|
||||
$groups = get_terms('user_group', array('hide_empty' => false));
|
||||
foreach ($groups as $group) :
|
||||
?>
|
||||
<option value="<?php echo esc_attr($group->term_id); ?>">
|
||||
<?php echo esc_html($group->name); ?>
|
||||
</option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<p class="description"><?php _e('Select the user groups that should have access to this category.', 'text-domain'); ?></p>
|
||||
</div>
|
||||
<?php
|
||||
}
|
||||
add_action('video_category_add_form_fields', 'video_category_add_group_field');
|
||||
|
||||
// Function to display user groups field for video category
|
||||
function video_category_edit_group_field($term)
|
||||
{
|
||||
$term_id = $term->term_id;
|
||||
$assigned_groups = get_term_meta($term_id, 'assigned_user_groups', true);
|
||||
if (!is_array($assigned_groups)) {
|
||||
$assigned_groups = array();
|
||||
}
|
||||
?>
|
||||
<tr class="form-field">
|
||||
<th scope="row" valign="top"><label for="video-category-group"><?php _e('User Groups Access', 'text-domain'); ?></label></th>
|
||||
<td>
|
||||
<select name="video_category_group[]" id="video-category-group" multiple>
|
||||
<?php
|
||||
$groups = get_terms('user_group', array('hide_empty' => false));
|
||||
foreach ($groups as $group) :
|
||||
?>
|
||||
<option value="<?php echo esc_attr($group->term_id); ?>" <?php echo in_array($group->term_id, $assigned_groups) ? 'selected' : ''; ?>>
|
||||
<?php echo esc_html($group->name); ?>
|
||||
</option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
<p class="description"><?php _e('Select the user groups that should have access to this category.', 'text-domain'); ?></p>
|
||||
</td>
|
||||
</tr>
|
||||
<?php
|
||||
}
|
||||
|
||||
add_action('video_category_edit_form_fields', 'video_category_edit_group_field');
|
||||
|
||||
// Function to save user groups for video category
|
||||
function save_video_category_group($term_id)
|
||||
{
|
||||
if (isset($_POST['video_category_group'])) {
|
||||
$group_ids = array_map('intval', $_POST['video_category_group']);
|
||||
update_term_meta($term_id, 'assigned_user_groups', $group_ids);
|
||||
}
|
||||
}
|
||||
|
||||
add_action('created_video_category', 'save_video_category_group');
|
||||
add_action('edited_video_category', 'save_video_category_group');
|
||||
|
||||
|
||||
// Shortcode to display videos based on user group
|
||||
function display_videos_shortcode($atts) {
|
||||
// Ensure a user is logged in
|
||||
$user_id = get_current_user_id();
|
||||
if (!$user_id) {
|
||||
return 'You must be logged in to view videos.';
|
||||
}
|
||||
|
||||
// Retrieves the user's groups
|
||||
$user_groups = get_user_meta($user_id, 'user_groups', true);
|
||||
if (empty($user_groups)) {
|
||||
return 'You are not assigned to any user groups.';
|
||||
}
|
||||
|
||||
// Fetches the categories that match the assigned user groups
|
||||
$category_query_args = array(
|
||||
'taxonomy' => 'video_category',
|
||||
'hide_empty' => false
|
||||
);
|
||||
$categories = get_terms($category_query_args);
|
||||
|
||||
// Checks if no categories were found, returns a message
|
||||
if (empty($categories) || is_wp_error($categories)) {
|
||||
return 'No video categories found.';
|
||||
}
|
||||
|
||||
// Initialize the output string
|
||||
$output = '<div class="video-categories">';
|
||||
|
||||
// Pagination variables
|
||||
$videos_per_page = 10; // Number of videos to display per page
|
||||
$paged = get_query_var('paged') ? get_query_var('paged') : 1; // Current page number
|
||||
|
||||
// Loop through each category and get the associated user groups
|
||||
foreach ($categories as $category) {
|
||||
// Get the associated user groups for this category
|
||||
$assigned_groups = get_term_meta($category->term_id, 'assigned_user_groups', true);
|
||||
$matching_groups = array_intersect($assigned_groups, $user_groups);
|
||||
|
||||
if (!empty($matching_groups)) {
|
||||
$output .= '<div class="video-category">';
|
||||
$output .= '<h3>' . esc_html($category->name) . '</h3>'; // Category name
|
||||
|
||||
// Set up the query for the videos within the category
|
||||
$video_query_args = array(
|
||||
'post_type' => 'video_gallery',
|
||||
'posts_per_page' => $videos_per_page,
|
||||
'paged' => $paged,
|
||||
'tax_query' => array(
|
||||
array(
|
||||
'taxonomy' => 'video_category',
|
||||
'field' => 'term_id',
|
||||
'terms' => $category->term_id,
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
// Execute the query
|
||||
$video_query = new WP_Query($video_query_args);
|
||||
|
||||
// Check if the category has any videos
|
||||
if ($video_query->have_posts()) {
|
||||
// Loop through the videos and display them
|
||||
while ($video_query->have_posts()) {
|
||||
$video_query->the_post();
|
||||
// Your markup for displaying the video details
|
||||
$output .= '<div class="video">';
|
||||
$output .= '<a href="' . get_post_permalink() . '"><h4>' . get_the_title() . '</h4></a>';
|
||||
$output .= output_video_html(get_the_ID());
|
||||
$output .= '</div>';
|
||||
}
|
||||
|
||||
// Pagination
|
||||
$pagination_args = array(
|
||||
'base' => get_pagenum_link(1) . '%_%',
|
||||
'format' => 'page/%#%',
|
||||
'current' => $paged,
|
||||
'total' => $video_query->max_num_pages,
|
||||
);
|
||||
$pagination = paginate_links($pagination_args);
|
||||
|
||||
if ($pagination) {
|
||||
$output .= '<div class="pagination">' . $pagination . '</div>';
|
||||
}
|
||||
|
||||
// Reset post data to the default query
|
||||
wp_reset_postdata();
|
||||
|
||||
} else {
|
||||
$output .= '<p>No videos available in this category.</p>';
|
||||
}
|
||||
$output .= '</div>'; // Close the video-category div
|
||||
}
|
||||
}
|
||||
$output .= '</div>'; // Close the wrap div
|
||||
return $output;
|
||||
}
|
||||
|
||||
add_shortcode('display_videos', 'display_videos_shortcode');
|
||||
|
||||
// Function to display video embed code above the text content
|
||||
function add_video_above_content() {
|
||||
// Get the text content
|
||||
$content = get_the_content();
|
||||
|
||||
// Check if we are on the single post page for the 'video_gallery' post type
|
||||
if (is_singular('video_gallery')) {
|
||||
// Fetch the video embed code from a custom field
|
||||
$video_embed_html = get_post_meta(get_the_ID(), 'video_embed_html', true);
|
||||
|
||||
// Ensure $video_embed_html is not null
|
||||
if (!empty($video_embed_html)) {
|
||||
// Prepend the video embed HTML to the content being filtered
|
||||
$content = '<div class="video-embed">' . wp_kses_post($video_embed_html) . '</div>' . $content;
|
||||
}
|
||||
}
|
||||
|
||||
// Return the possibly modified content
|
||||
return $content;
|
||||
}
|
||||
|
||||
// Assuming your theme has a 'the_content' hook, replace with actual hook name if different
|
||||
add_action('the_content', 'add_video_above_content', 10);
|
||||
|
||||
|
||||
// Function to add video embed code meta box to video gallery post type
|
||||
function add_video_embed_meta_box()
|
||||
{
|
||||
add_meta_box(
|
||||
'video_embed_code', // ID of the meta box
|
||||
'Video Embed Code', // Title of the meta box
|
||||
'video_embed_html_meta_box_callback', // Callback function
|
||||
'video_gallery', // Post type
|
||||
'normal', // Context where the box should show
|
||||
'high' // Priority within the context
|
||||
);
|
||||
}
|
||||
|
||||
add_action('add_meta_boxes', 'add_video_embed_meta_box');
|
||||
|
||||
// Function to output video embed code meta box
|
||||
function video_embed_html_meta_box_callback($post)
|
||||
{
|
||||
// Add a nonce field so we can check for it later.
|
||||
wp_nonce_field('video_embed_code_nonce', 'video_embed_code_nonce_field');
|
||||
|
||||
// Get the current value if any
|
||||
$embed_code = get_post_meta($post->ID, 'video_embed_html', true);
|
||||
|
||||
// Echo out the field
|
||||
echo '<textarea id="video_embed_html" name="video_embed_html" rows="4" cols="50" class="widefat">' . esc_textarea($embed_code) . '</textarea>';
|
||||
}
|
||||
|
||||
// Function to save video embed code meta box
|
||||
function save_video_embed_code($post_id)
|
||||
{
|
||||
// Check if our nonce is set.
|
||||
if (!isset($_POST['video_embed_code_nonce_field'])) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Verify that the nonce is valid.
|
||||
if (!wp_verify_nonce($_POST['video_embed_code_nonce_field'], 'video_embed_code_nonce')) {
|
||||
return;
|
||||
}
|
||||
|
||||
// If this is an autosave, our form has not been submitted, so we don't want to do anything.
|
||||
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Check the user's permissions.
|
||||
if (isset($_POST['post_type']) && 'video_gallery' == $_POST['post_type']) {
|
||||
if (!current_user_can('edit_post', $post_id)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Make sure that it is set.
|
||||
if (!isset($_POST['video_embed_html'])) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Sanitize and save the input
|
||||
$embed_code = wp_kses_post($_POST['video_embed_html']);
|
||||
update_post_meta($post_id, 'video_embed_html', $embed_code);
|
||||
}
|
||||
|
||||
add_action('save_post', 'save_video_embed_code');
|
||||
|
||||
|
||||
// Enqueue necessary scripts and styles (if any)
|
||||
function enqueue_plugin_scripts_and_styles()
|
||||
{
|
||||
// Example of including a CSS file
|
||||
// wp_enqueue_style('video-gallery-style', plugins_url('/css/style.css', __FILE__));
|
||||
}
|
||||
|
||||
add_action('wp_enqueue_scripts', 'enqueue_plugin_scripts_and_styles');
|
||||
|
||||
// Activation and Deactivation hooks
|
||||
function plugin_activation()
|
||||
{
|
||||
register_video_gallery_cpt();
|
||||
register_video_gallery_taxonomies();
|
||||
|
||||
flush_rewrite_rules();
|
||||
}
|
||||
|
||||
register_activation_hook(__FILE__, 'plugin_activation');
|
||||
|
||||
function add_group_assignment_capability() {
|
||||
// Get the administrator role
|
||||
$admin_role = get_role('administrator');
|
||||
|
||||
// Add a new capability for group assignment
|
||||
$admin_role->add_cap('assign_user_groups', true);
|
||||
}
|
||||
|
||||
register_activation_hook(__FILE__, 'add_group_assignment_capability');
|
||||
|
||||
function plugin_deactivation()
|
||||
{
|
||||
flush_rewrite_rules();
|
||||
}
|
||||
|
||||
register_deactivation_hook(__FILE__, 'plugin_deactivation');
|
||||
|
||||
function remove_group_assignment_capability() {
|
||||
// Get the administrator role
|
||||
$admin_role = get_role('administrator');
|
||||
|
||||
// Remove the capability for group assignment
|
||||
$admin_role->remove_cap('assign_user_groups');
|
||||
}
|
||||
|
||||
register_deactivation_hook(__FILE__, 'remove_group_assignment_capability');
|
||||
|
||||
// Function to allow iframe tags in posts
|
||||
function custom_allow_iframe_tags_in_posts($allowedposttags)
|
||||
{
|
||||
$allowedposttags['iframe'] = array(
|
||||
'align' => true,
|
||||
'width' => true,
|
||||
'height' => true,
|
||||
'frameborder' => true,
|
||||
'name' => true,
|
||||
'src' => true,
|
||||
'id' => true,
|
||||
'class' => true,
|
||||
'style' => true,
|
||||
'scrolling' => true,
|
||||
'marginwidth' => true,
|
||||
'marginheight' => true,
|
||||
'allowfullscreen' => true,
|
||||
'sandbox' => true,
|
||||
'title' => true
|
||||
);
|
||||
|
||||
return $allowedposttags;
|
||||
}
|
||||
|
||||
add_filter('wp_kses_allowed_html', 'custom_allow_iframe_tags_in_posts', 1);
|
Loading…
Reference in a new issue