Files
2024-10-11 13:25:50 -04:00

354 lines
14 KiB
PHP

<?php
/* Prohibit direct script loading */
defined('ABSPATH') || die('No direct script access allowed!');
use Joomunited\WPMediaFolder\WpmfHelper;
/**
* Class WpmfFolderAccess
*/
class WpmfFolderAccess
{
/**
* WpmfFolderAccess constructor.
*/
public function __construct()
{
add_action('init', array($this, 'createUserFolder'));
add_filter('wp_generate_attachment_metadata', array($this, 'autoAddAttachmentToFolder'), 10, 2);
}
/**
* Create user folder
*
* @return void
*/
public function createUserFolder()
{
// insert term when user login and enable option 'Display only media by User/User'
global $current_user;
$user_roles = $current_user->roles;
$role = array_shift($user_roles);
/**
* Filter check capability of current user when create user folder
*
* @param boolean The current user has the given capability
* @param string Action name
*
* @return boolean
*
* @ignore Hook already documented
*/
$wpmf_capability = apply_filters('wpmf_user_can', current_user_can('upload_files'), 'create_user_folder');
if (($role !== 'administrator' && $wpmf_capability) || $role === 'employer') {
$wpmf_create_folder = get_option('wpmf_create_folder');
$parent = $this->getUserParentFolder();
$cloud_type = get_term_meta($parent, 'wpmf_drive_type', true);
$check_term = false;
if ($wpmf_create_folder === 'user') {
$slug = sanitize_title($current_user->data->user_login) . '-wpmf';
$check_term = get_term_by('slug', $slug, WPMF_TAXO);
} elseif ($wpmf_create_folder === 'role') {
$slug = sanitize_title($role) . '-wpmf-role';
$check_term = get_term_by('slug', $slug, WPMF_TAXO);
}
if (empty($check_term) && !$cloud_type) {
$this->doCreateUserFolder($current_user->data->user_login, $slug, $parent, $current_user);
}
$google_connect = WpmfHelper::isConnected('google_drive');
$dropbox_connect = WpmfHelper::isConnected('dropbox');
$onedrive_connect = WpmfHelper::isConnected('onedrive');
$onedrive_business_connect = WpmfHelper::isConnected('onedrive_business');
if ($google_connect) {
$options = get_option('_wpmfAddon_cloud_config');
if (!empty($options['access_by']) && $options['access_by'] === 'user') {
$is_exist = get_term_by('slug', $current_user->data->user_login . '-wpmf-google_drive', WPMF_TAXO);
$name = $current_user->data->user_login;
$slug = $current_user->data->user_login . '-wpmf-google_drive';
$type = 'user';
} else {
$is_exist = get_term_by('slug', $role . '-wpmf-role-google_drive', WPMF_TAXO);
$name = $role;
$slug = $role . '-wpmf-role-google_drive';
$type = 'role';
}
if (empty($is_exist)) {
$parent = WpmfHelper::getCloudRootFolderID('google_drive');
if ($parent) {
$this->doCreateUserFolder($name, $slug, $parent, $current_user, $type);
}
}
}
if ($dropbox_connect) {
$options = get_option('_wpmfAddon_dropbox_config');
if (!empty($options['access_by']) && $options['access_by'] === 'user') {
$is_exist = get_term_by('slug', $current_user->data->user_login . '-wpmf-dropbox', WPMF_TAXO);
$name = $current_user->data->user_login;
$slug = $current_user->data->user_login . '-wpmf-dropbox';
$type = 'user';
} else {
$is_exist = get_term_by('slug', $role . '-wpmf-role-dropbox', WPMF_TAXO);
$name = $role;
$slug = $role . '-wpmf-role-dropbox';
$type = 'role';
}
if (empty($is_exist)) {
$parent = WpmfHelper::getCloudRootFolderID('dropbox');
if ($parent) {
$this->doCreateUserFolder($name, $slug, $parent, $current_user, $type);
}
}
}
if ($onedrive_connect) {
$options = get_option('_wpmfAddon_onedrive_config');
if (!empty($options['access_by']) && $options['access_by'] === 'user') {
$is_exist = get_term_by('slug', $current_user->data->user_login . '-wpmf-onedrive', WPMF_TAXO);
$name = $current_user->data->user_login;
$slug = $current_user->data->user_login . '-wpmf-onedrive';
$type = 'user';
} else {
$is_exist = get_term_by('slug', $role . '-wpmf-role-onedrive', WPMF_TAXO);
$name = $role;
$slug = $role . '-wpmf-role-onedrive';
$type = 'role';
}
if (empty($is_exist)) {
$parent = WpmfHelper::getCloudRootFolderID('onedrive');
if ($parent) {
$this->doCreateUserFolder($name, $slug, $parent, $current_user, $type);
}
}
}
if ($onedrive_business_connect) {
$options = get_option('_wpmfAddon_onedrive_business_config');
if (!empty($options['access_by']) && $options['access_by'] === 'user') {
$is_exist = get_term_by('slug', $current_user->data->user_login . '-wpmf-onedrive_business', WPMF_TAXO);
$name = $current_user->data->user_login;
$slug = $current_user->data->user_login . '-wpmf-onedrive_business';
$type = 'user';
} else {
$is_exist = get_term_by('slug', $role . '-wpmf-role-onedrive_business', WPMF_TAXO);
$name = $role;
$slug = $role . '-wpmf-role-onedrive_business';
$type = 'role';
}
if (empty($is_exist)) {
$parent = WpmfHelper::getCloudRootFolderID('onedrive_business');
if ($parent) {
$this->doCreateUserFolder($name, $slug, $parent, $current_user, $type);
}
}
}
}
}
/**
* Do create user folder
*
* @param string $name Folder name
* @param string $slug Folder slug
* @param integer $parent Folder parent
* @param object $current_user Current_user
* @param string $type Type
*
* @return void
*/
public function doCreateUserFolder($name, $slug, $parent, $current_user, $type = 'user')
{
$inserted = wp_insert_term(
$name,
WPMF_TAXO,
array('parent' => $parent, 'slug' => $slug)
);
if (!is_wp_error($inserted)) {
if ($type === 'user') {
wp_update_term($inserted['term_id'], WPMF_TAXO, array('term_group' => $current_user->data->ID));
add_term_meta((int)$inserted['term_id'], 'wpmf_folder_user_permissions', array($current_user->data->ID, 'add_media', 'move_media', 'view_folder', 'add_folder', 'update_folder', 'remove_folder', 'view_media', 'remove_media', 'update_media'));
add_term_meta((int)$inserted['term_id'], 'inherit_folder', 0);
} else {
$role = WpmfHelper::getRoles($current_user->data->ID);
add_term_meta((int)$inserted['term_id'], 'wpmf_folder_role_permissions', array($role, 'add_media', 'move_media', 'view_folder', 'add_folder', 'update_folder', 'remove_folder', 'view_media', 'remove_media', 'update_media'));
add_term_meta((int)$inserted['term_id'], 'inherit_folder', 0);
}
$cloud_type = get_term_meta($parent, 'wpmf_drive_type', true);
if (!empty($cloud_type)) {
do_action('wpmf_create_folder', $inserted['term_id'], $name, $parent, array('trigger' => 'media_library_action'));
}
}
}
/**
* Auto add attachment to folder
*
* @param array $data Meta data
* @param integer $post_id Attachment ID
*
* @return array
*/
public function autoAddAttachmentToFolder($data, $post_id)
{
$active_media = get_option('wpmf_active_media');
if (isset($active_media) && (int) $active_media === 1) {
$wpmf_create_folder = get_option('wpmf_create_folder');
if ($wpmf_create_folder === 'user') {
global $wpdb, $current_user;
if (!empty($current_user->ID)) {
$user_login = $current_user->data->user_login;
$user_roles = $current_user->roles;
$role = array_shift($user_roles);
if ($role === 'employer') {
$parent = $this->getUserParentFolder();
$user_folder = $wpdb->get_row($wpdb->prepare('SELECT * FROM ' . $wpdb->terms . ' as t INNER JOIN ' . $wpdb->term_taxonomy . ' AS tt ON tt.term_id = t.term_id WHERE t.name = %s AND t.term_group = %d AND tt.parent = %d AND tt.taxonomy = %s', array($user_login, (int) $current_user->ID, (int) $parent, WPMF_TAXO)));
if (!empty($user_folder)) {
wp_set_object_terms($post_id, $user_folder->term_id, WPMF_TAXO, true);
}
}
}
}
}
return $data;
}
/**
* Get user parent folder
*
* @return integer|mixed|void
*/
public function getUserParentFolder()
{
$wpmf_checkbox_tree = get_option('wpmf_checkbox_tree');
$parent = 0;
if (!empty($wpmf_checkbox_tree)) {
$current_parrent = get_term($wpmf_checkbox_tree, WPMF_TAXO);
if (!empty($current_parrent)) {
$parent = $wpmf_checkbox_tree;
}
}
return $parent;
}
/**
* Delete folders created by the user
*
* @param integer $user_id User ID
*
* @return void
*/
public static function deleteUserFolders($user_id)
{
global $wpdb;
// Get folders created by the user
$folders = $wpdb->get_results($wpdb->prepare(
'SELECT term_id FROM ' . $wpdb->terms . ' WHERE term_group = %d',
$user_id
));
if (!empty($folders)) {
foreach ($folders as $folder) {
wp_delete_term($folder->term_id, WPMF_TAXO);
}
}
}
/**
* Delete folders created by deleted users
*
* @return void
*/
public static function deleteFoldersOfDeletedUsers()
{
global $wpdb;
$wpmf_checkbox_tree = get_option('wpmf_checkbox_tree');
$parent = 0;
if (!empty($wpmf_checkbox_tree)) {
$current_parrent = get_term($wpmf_checkbox_tree, WPMF_TAXO);
if (!empty($current_parrent)) {
$parent = $wpmf_checkbox_tree;
}
}
$descendant_term_ids = get_term_children($parent, WPMF_TAXO);
if (empty($descendant_term_ids)) {
return;
}
$descendant_term_ids_str = implode(',', $descendant_term_ids);
$query = '
SELECT t.term_id, t.term_group
FROM ' . $wpdb->terms . ' t
INNER JOIN ' . $wpdb->term_taxonomy . ' tt ON t.term_id = tt.term_id
WHERE tt.taxonomy = %s
AND t.term_group != 0
AND tt.term_id IN (' . $descendant_term_ids_str . ')
';
$folders = $wpdb->get_results($wpdb->prepare($query, WPMF_TAXO)); // phpcs:ignore
if (!empty($folders)) {
foreach ($folders as $folder) {
// Check if the user still exists
if (!get_user_by('ID', $folder->term_group)) {
// If the user does not exist, delete the folder
wp_delete_term($folder->term_id, WPMF_TAXO);
}
}
}
}
/**
* Add admin menu for deleting user folders
*
* @return void
*/
public static function addDeleteUserFoldersMenu()
{
add_menu_page(
esc_html__('WPMF Delete Folders of Deleted Users', 'wpmf'),
esc_html__('WPMF Delete Folders', 'wpmf'),
'manage_options',
'wpmf-delete-user-folders',
array('WpmfFolderAccess', 'deleteUserFoldersPage')
);
}
/**
* Callback to render the admin page for deleting folders
*
* @return void
*/
public static function deleteUserFoldersPage()
{
// Handle the form submission
// phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.NonceVerification.Missing -- No action, nonce is not required
if (isset($_POST['delete_folders'])) {
self::deleteFoldersOfDeletedUsers();
echo '<div class="updated"><p>' . esc_html__('All folders of deleted users have been removed.', 'wpmf') . '</p></div>';
}
?>
<div class="wrap">
<h1><?php echo esc_html__('Delete Folders of Deleted Users', 'wpmf'); ?></h1>
<form method="post" action="">
<input type="hidden" name="delete_folders" value="1" />
<p>
<input type="submit" class="button-primary" value="<?php echo esc_attr__('Delete Folders', 'wpmf'); ?>" />
</p>
</form>
</div>
<?php
}
}