Create New Item
×
Item Type
File
Folder
Item Name
×
Search file in folder and subfolders...
File Manager
/
wp-content
/
plugins
/
publishpress-authors
/
src
/
modules
/
author-boxes
Advanced Search
Upload
New Item
Settings
Back
Back Up
Advanced Editor
Save
<?php /** * @package PublishPress Authors * @author PublishPress * * Copyright (C) 2018 PublishPress * * This file is part of PublishPress Authors * * PublishPress Authors is free software: you can redistribute it * and/or modify it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the License, * or (at your option) any later version. * * PublishPress is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with PublishPress. If not, see <http://www.gnu.org/licenses/>. */ use MultipleAuthors\Classes\Objects\Author; use MultipleAuthors\Classes\Legacy\Module; use MultipleAuthorBoxes\AuthorBoxesDefault; use MultipleAuthors\Classes\Author_Editor; use MultipleAuthorBoxes\AuthorBoxesStyles; use MultipleAuthors\Classes\Post_Editor; use MultipleAuthors\Classes\Utils; use MultipleAuthors\Factory; /** * class MA_Author_Boxes */ class MA_Author_Boxes extends Module { /** * Post Type. */ const POST_TYPE_BOXES = 'ppma_boxes'; /** * Excluded profile fields */ const AUTHOR_BOXES_EXCLUDED_FIELDS = ['user_id', 'avatar', 'description', 'author_category', 'exclude_author']; /** * Meta data prefix. */ const META_PREFIX = 'ppma_boxes_'; public $module_name = 'author_boxes'; /** * Instance of the module * * @var stdClass */ public $module; public $module_url; /** * @var array */ protected $customFields = null; /** * Construct the MA_Multiple_Authors class */ public function __construct() { $this->module_url = $this->get_module_url(__FILE__); // Register the module with PublishPress $args = [ 'title' => __('Author Boxes', 'publishpress-authors'), 'short_description' => __( 'Add support for author boxes.', 'publishpress-authors' ), 'extended_description' => __( 'Add support for author boxes.', 'publishpress-authors' ), 'module_url' => $this->module_url, 'icon_class' => 'dashicons dashicons-edit', 'slug' => 'author-boxes', 'default_options' => [ 'enabled' => 'on', ], 'options_page' => false, 'autoload' => true, ]; // Apply a filter to the default options $args['default_options'] = apply_filters('MA_Author_Boxes_default_options', $args['default_options']); $legacyPlugin = Factory::getLegacyPlugin(); $this->module = $legacyPlugin->register_module($this->module_name, $args); parent::__construct(); } /** * Initialize the module. Conditionally loads if the module is enabled */ public function init() { add_action('multiple_authors_admin_submenu', [$this, 'adminSubmenu'], 50); add_filter('post_updated_messages', [$this, 'setPostUpdateMessages']); add_filter('bulk_post_updated_messages', [$this, 'setPostBulkUpdateMessages'], 10, 2); add_action('add_meta_boxes', [$this, 'addPreviewMetabox']); add_action('add_meta_boxes', [$this, 'addEditorMetabox']); add_action('add_meta_boxes', [$this, 'addLayoutSlugMetabox']); add_action('add_meta_boxes', [$this, 'addShortcodeMetabox']); add_action('add_meta_boxes', [$this, 'addBannerMetabox']); add_action('admin_enqueue_scripts', [$this, 'enqueueAdminScripts']); add_filter('author_boxes_editor_fields', ['MultipleAuthorBoxes\AuthorBoxesEditorFields', 'getTitleFields'], 10, 2); add_filter('author_boxes_editor_fields', ['MultipleAuthorBoxes\AuthorBoxesEditorFields', 'getAvatarFields'], 10, 2); add_filter('author_boxes_editor_fields', ['MultipleAuthorBoxes\AuthorBoxesEditorFields', 'getNameFields'], 10, 2); add_filter('author_boxes_editor_fields', ['MultipleAuthorBoxes\AuthorBoxesEditorFields', 'getMetaFields'], 10, 2); add_filter('author_boxes_editor_fields', ['MultipleAuthorBoxes\AuthorBoxesEditorFields', 'getAuthorCategories'], 10, 2); add_filter('author_boxes_editor_fields', ['MultipleAuthorBoxes\AuthorBoxesEditorFields', 'getProfileFields'], 10, 2); add_filter('author_boxes_editor_fields', ['MultipleAuthorBoxes\AuthorBoxesEditorFields', 'getShortcodeFields'], 10, 2); add_filter('author_boxes_editor_fields', ['MultipleAuthorBoxes\AuthorBoxesEditorFields', 'getBioFields'], 10, 2); add_filter('author_boxes_editor_fields', ['MultipleAuthorBoxes\AuthorBoxesEditorFields', 'getRecentPostsFields'], 10, 2); add_filter('author_boxes_editor_fields', ['MultipleAuthorBoxes\AuthorBoxesEditorFields', 'getBoxLayoutFields'], 10, 2); add_filter('author_boxes_editor_fields', ['MultipleAuthorBoxes\AuthorBoxesEditorFields', 'getCustomCssFields'], 10, 2); add_filter('author_boxes_editor_fields', ['MultipleAuthorBoxes\AuthorBoxesEditorFields', 'getExportFields'], 10, 2); add_filter('author_boxes_editor_fields', ['MultipleAuthorBoxes\AuthorBoxesEditorFields', 'getImportFields'], 10, 2); add_filter('author_boxes_editor_fields', ['MultipleAuthorBoxes\AuthorBoxesEditorFields', 'getGenerateTemplateFields'], 10, 2); add_action("save_post_" . self::POST_TYPE_BOXES, [$this, 'saveAuthorBoxesData']); add_filter('manage_edit-' . self::POST_TYPE_BOXES . '_columns', [$this, 'filterAuthorBoxesColumns']); add_action('manage_' . self::POST_TYPE_BOXES . '_posts_custom_column', [$this, 'manageAuthorBoxesColumns'], 10, 2); add_filter('pp_multiple_authors_author_layouts', [$this, 'filterAuthorLayouts'], 9); add_filter('pp_multiple_authors_author_box_html', [$this, 'filterAuthorBoxHtml'], 9, 2); add_filter('pp_multiple_authors_authors_list_box_html', [$this, 'filterAuthorBoxHtml'], 9, 2); add_filter('bulk_actions-edit-' . self::POST_TYPE_BOXES . '', [$this, 'removeBulkActionEdit'], 11); add_action('pre_get_posts', [$this, 'author_author_boxes_default_sort']); add_filter('parent_file', [$this, 'setParentFile']); add_action('admin_head', [$this, 'addInlineScripts']); add_action('wp_footer', [$this, 'addAuthorBoxStyles']); add_action('enqueue_block_editor_assets', [$this, 'author_boxes_block_enqueue_assets']); add_action('wp_ajax_ppma_block_fetch_author_boxes', [$this, 'ppma_block_fetch_author_boxes']); add_action('wp_ajax_nopriv_ppma_block_fetch_author_boxes', [$this, 'ppma_block_fetch_author_boxes']); add_action('wp_ajax_author_boxes_editor_get_preview', ['MultipleAuthorBoxes\AuthorBoxesAjax', 'handle_author_boxes_editor_get_preview']); add_action('wp_ajax_author_boxes_editor_get_template', ['MultipleAuthorBoxes\AuthorBoxesAjax', 'handle_author_boxes_editor_get_template']); add_action('wp_ajax_author_boxes_editor_save_fields_order', ['MultipleAuthorBoxes\AuthorBoxesAjax', 'handle_author_boxes_fields_order']); add_action('wp_ajax_author_boxes_editor_get_fields_icons', ['MultipleAuthorBoxes\AuthorBoxesAjax', 'handle_author_boxes_editor_get_fields_icons']); $this->author_boxes_block_register(); $this->registerPostType(); } /** * Return author boxes default tab * * @return string */ public static function default_tab() { return apply_filters('ma_author_boxes_editor_default_tab', 'title'); } /** * Set authors menu as parent for post type so menu is shown * as active when on post type edit screen. * * @param string $parent_file * * @return string */ public function setParentFile($parent_file) { global $submenu_file, $current_screen; // Check if the current screen is the User Code page if (!empty($current_screen->post_type) && $current_screen->post_type == self::POST_TYPE_BOXES) { $parent_file = \MA_Multiple_Authors::MENU_SLUG; $submenu_file = 'edit.php?post_type=' . self::POST_TYPE_BOXES; } return $parent_file; } /** * @param $columns * * @return array */ public function filterAuthorBoxesColumns($columns) { $columns['default_author_boxes'] = esc_html__('Default Author Box', 'publishpress-authors'); if (Utils::isAuthorsProActive()) { $columns['author_category_boxes'] = esc_html__('Author Category Boxes', 'publishpress-authors'); } $columns['shortcode'] = esc_html__('Shortcode', 'publishpress-authors'); unset($columns['date']); return $columns; } /** * @param $column * @param $postId */ public function manageAuthorBoxesColumns($column, $postId) { $legacyPlugin = Factory::getLegacyPlugin(); if ($column === 'shortcode') { $layout_slug = self::POST_TYPE_BOXES . '_' . $postId; ?> <input readonly type="text" value='[publishpress_authors_box layout="<?php echo esc_attr($layout_slug); ?>"]' /> <?php } elseif ($column === 'default_author_boxes') { if ( $legacyPlugin->modules->multiple_authors->options->layout == 'ppma_boxes_' .$postId || ( (empty($legacyPlugin->modules->multiple_authors->options->layout) || in_array($legacyPlugin->modules->multiple_authors->options->layout, ['author_boxes_boxed', 'boxed'])) && get_post_field('post_name', $postId) === 'author_boxes_boxed') ) : ?> <span class="dashicons dashicons-yes-alt ppma-green-check"></span> <?php endif; } elseif ($column === 'author_category_boxes') { $layout_parent = get_post_meta($postId, self::META_PREFIX . 'layout_parent_author_box', true); if (!empty($layout_parent)) : ?> <span class="dashicons dashicons-yes-alt ppma-green-check"></span> <?php endif; } } /** * Save Author boxes data * * @param integer $post_id post id * * @return void */ public function saveAuthorBoxesData($post_id) { if (empty($_POST['author-boxes-editor-nonce']) || !wp_verify_nonce(sanitize_key($_POST['author-boxes-editor-nonce']), 'author-boxes-editor')) { return; } $post = get_post($post_id); $fields = apply_filters('multiple_authors_author_boxes_fields', self::get_fields($post), $post); $excluded_input = ['template_action', 'import_action']; $meta_data = []; $preview_author_post = isset($_POST['preview_author_post']) ? sanitize_text_field($_POST['preview_author_post']) : ''; $parent_author_box = isset($_POST['parent_author_box']) ? sanitize_text_field($_POST['parent_author_box']) : ''; foreach ($fields as $key => $args) { if (!isset($_POST[$key]) || in_array($key, $excluded_input)) { continue; } if (isset($args['sanitize']) && is_array($args['sanitize']) && $_POST[$key] !== '') { $value = $_POST[$key]; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized foreach ($args['sanitize'] as $sanitize) { $value = is_array($value) ? map_deep($value, $sanitize) : $sanitize($value); } $meta_data[$key] = $value; } else { $sanitize = isset($args['sanitize']) ? $args['sanitize'] : 'sanitize_text_field'; $meta_data[$key] = (isset($_POST[$key]) && $_POST[$key] !== '') ? $sanitize($_POST[$key]) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized } } update_post_meta($post_id, self::META_PREFIX . 'layout_parent_author_box', $parent_author_box); update_post_meta($post_id, self::META_PREFIX . 'layout_preview_author_post', $preview_author_post); update_post_meta($post_id, self::META_PREFIX . 'layout_meta_value', $meta_data); } /** * Strip out unwanted html * * @param string $string * @return string */ public function stripOutUnwantedHtml($string) { $allowed_tags = '<span><i>'; $string = strip_tags($string, $allowed_tags); return $string; } /** * Create default author boxes in the database. */ public static function createDefaultAuthorBoxes() { $defaultAuthorBoxes = array_reverse(AuthorBoxesDefault::getAuthorBoxesDefaultList()); foreach ($defaultAuthorBoxes as $name => $title) { self::createLayoutPost($name, $title); sleep(2); } if (Utils::isAuthorsProActive()) { \MA_Author_Boxes_Pro::createDefaultAuthorBoxes(); } } /** * Update author boxes field value. * * @param array $fields_data * @return void */ public static function updateAuthorBoxesFieldValue($fields_data, $layout_slugs = false) { if ($layout_slugs && is_array($layout_slugs)) { foreach ($layout_slugs as $layout_slug) { $layout_post = get_page_by_path($layout_slug, OBJECT, self::POST_TYPE_BOXES); if ($layout_post && $layout_post->post_status === 'publish') { $post_id = $layout_post->ID; self::updateAuthorBoxesIdFieldValues($post_id, $fields_data); } } } else { $author_boxes = self::getAuthorBoxes(); if (!empty($author_boxes)) { foreach (array_keys($author_boxes) as $author_box) { $post_id = preg_replace("/[^0-9]/", "", $author_box); self::updateAuthorBoxesIdFieldValues($post_id, $fields_data); } } } } /** * Update author boxes field value by ID. * * @param integer $post_id * @param array $fields_data * @return void */ public static function updateAuthorBoxesIdFieldValues($post_id, $fields_data) { $editor_data = get_post_meta($post_id, self::META_PREFIX . 'layout_meta_value', true); if ($editor_data && is_array($editor_data)) { foreach ($fields_data as $field_name => $field_value) { $editor_data[$field_name] = $field_value; } update_post_meta($post_id, self::META_PREFIX . 'layout_meta_value', $editor_data); } } /** * Create the layout based on name and title * * @param string $name * @param string $title */ protected static function createLayoutPost($name, $title) { // Check if we already have the layout based on the slug. $existingAuthorBox = Utils::get_page_by_title($title, OBJECT, self::POST_TYPE_BOXES); if ($existingAuthorBox && $existingAuthorBox->post_status === 'publish') { return; } $editor_data = AuthorBoxesDefault::getAuthorBoxesDefaultData($name); if ($editor_data && is_array($editor_data)) { $post_name = sanitize_title($name); $post_id = wp_insert_post( [ 'post_type' => self::POST_TYPE_BOXES, 'post_title' => $title, 'post_content' => $title, 'post_status' => 'publish', 'post_name' => $post_name, ] ); update_post_meta($post_id, self::META_PREFIX . 'layout_meta_value', $editor_data); if ($post_name === 'author_boxes_boxed') { $legacyPlugin = Factory::getLegacyPlugin(); $legacyPlugin->update_module_option('multiple_authors', 'layout', self::POST_TYPE_BOXES . '_' . $post_id); $legacyPlugin->update_module_option('multiple_authors', 'author_pages_bio_layout', self::POST_TYPE_BOXES . '_' . $post_id); } } } /** * Register the post types. */ private function registerPostType() { $labelSingular = __('Author Box', 'publishpress-authors'); $labelPlural = __('Author Boxes', 'publishpress-authors'); $postTypeLabels = [ 'name' => _x('%2$s', 'Author Box post type name', 'publishpress-authors'), 'singular_name' => _x( '%1$s', 'singular author box post type name', 'publishpress-authors' ), 'add_new' => __('New %1s', 'publishpress-authors'), 'add_new_item' => __('Add New %1$s', 'publishpress-authors'), 'edit_item' => __('Edit %1$s', 'publishpress-authors'), 'new_item' => __('New %1$s', 'publishpress-authors'), 'all_items' => __('%2$s', 'publishpress-authors'), 'view_item' => __('View %1$s', 'publishpress-authors'), 'search_items' => __('Search %2$s', 'publishpress-authors'), 'not_found' => __('No %2$s found', 'publishpress-authors'), 'not_found_in_trash' => __('No %2$s found in Trash', 'publishpress-authors'), 'parent_item_colon' => '', 'menu_name' => _x('%2$s', 'custom layout post type menu name', 'publishpress-authors'), 'featured_image' => __('%1$s Image', 'publishpress-authors'), 'set_featured_image' => __('Set %1$s Image', 'publishpress-authors'), 'remove_featured_image' => __('Remove %1$s Image', 'publishpress-authors'), 'use_featured_image' => __('Use as %1$s Image', 'publishpress-authors'), 'filter_items_list' => __('Filter %2$s list', 'publishpress-authors'), 'items_list_navigation' => __('%2$s list navigation', 'publishpress-authors'), 'items_list' => __('%2$s list', 'publishpress-authors'), ]; foreach ($postTypeLabels as $labelKey => $labelValue) { $postTypeLabels[$labelKey] = sprintf($labelValue, $labelSingular, $labelPlural); } $postTypeArgs = [ 'labels' => $postTypeLabels, 'public' => false, 'publicly_queryable' => false, 'show_ui' => true, 'show_in_menu' => false, 'map_meta_cap' => true, 'has_archive' => self::POST_TYPE_BOXES, 'hierarchical' => false, 'rewrite' => false, 'supports' => ['title'], ]; register_post_type(self::POST_TYPE_BOXES, $postTypeArgs); } /** * Add the admin submenu. */ public function adminSubmenu() { $legacyPlugin = Factory::getLegacyPlugin(); // Add the submenu to the PublishPress menu. add_submenu_page( \MA_Multiple_Authors::MENU_SLUG, esc_html__('Author Boxes', 'publishpress-authors'), esc_html__('Author Boxes', 'publishpress-authors'), apply_filters('pp_multiple_authors_manage_layouts_cap', 'ppma_manage_layouts'), 'edit.php?post_type=' . self::POST_TYPE_BOXES ); } /** * Add custom update messages to the post_updated_messages filter flow. * * @param array $messages Post updated messages. * * @return array $messages */ public function setPostUpdateMessages($messages) { $messages[self::POST_TYPE_BOXES] = [ 1 => __('Author Box updated.', 'publishpress-authors'), 4 => __('Author Box updated.', 'publishpress-authors'), 6 => __('Author Box added.', 'publishpress-authors'), 7 => __('Author Box saved.', 'publishpress-authors'), 8 => __('Author Box submitted.', 'publishpress-authors'), ]; return $messages; } /** * Add custom update messages to the bulk_post_updated_messages filter flow. * * @param array $messages Array of messages. * @param array $counts Array of item counts for each message. * * @return array $messages */ public function setPostBulkUpdateMessages($messages, $counts) { $countsUpdated = (int)$counts['updated']; $countsLocked = (int)$counts['locked']; $countsDeleted = (int)$counts['deleted']; $countsTrashed = (int)$counts['trashed']; $countsUntrashed = (int)$counts['untrashed']; $postTypeNameSingular = __('Author Box', 'publishpress-authors'); $postTypeNamePlural = __('Author Boxes', 'publishpress-authors'); $messages[self::POST_TYPE_BOXES] = [ 'updated' => sprintf( _n('%1$s %2$s updated.', '%1$s %3$s updated.', $countsUpdated), $countsUpdated, $postTypeNameSingular, $postTypeNamePlural ), 'locked' => sprintf( _n( '%1$s %2$s not updated, somebody is editing it.', '%1$s %3$s not updated, somebody is editing them.', $countsLocked ), $countsLocked, $postTypeNameSingular, $postTypeNamePlural ), 'deleted' => sprintf( _n('%1$s %2$s permanently deleted.', '%1$s %3$s permanently deleted.', $countsDeleted), $countsDeleted, $postTypeNameSingular, $postTypeNamePlural ), 'trashed' => sprintf( _n('%1$s %2$s moved to the Trash.', '%1$s %3$s moved to the Trash.', $countsTrashed), $countsTrashed, $postTypeNameSingular, $postTypeNamePlural ), 'untrashed' => sprintf( _n('%1$s %2$s restored from the Trash.', '%1$s %3$s restored from the Trash.', $countsUntrashed), $countsUntrashed, $postTypeNameSingular, $postTypeNamePlural ), ]; return $messages; } /** * Remove "Edit" from bulk action * * @param array $actions * * @return array */ public function removeBulkActionEdit($actions) { if (isset($actions['edit'])) { unset($actions['edit']); } return $actions; } /** * @param $layouts * * @return array */ public function filterAuthorLayouts($layouts) { //add theme layouts $layouts = array_merge($layouts, self::getThemeAuthorBoxes()); //add boxes layout $layouts = array_merge($layouts, self::getAuthorBoxes()); return $layouts; } public static function authorBoxesMetaRemovalUpdate() { $post_args = [ 'post_type' => self::POST_TYPE_BOXES, 'posts_per_page' => -1, 'post_status' => 'publish', ]; $posts = get_posts($post_args); if (! empty($posts)) { foreach ($posts as $post) { $editor_data = (array) get_post_meta($post->ID, self::META_PREFIX . 'layout_meta_value', true); //meta default $editor_data['meta_html_tag'] = 'span'; $editor_data['meta_label'] = __('View all posts', 'publishpress-authors'); // hide all default fields $editor_data['profile_fields_hide_first_name'] = 1; $editor_data['profile_fields_hide_last_name'] = 1; // style email field $editor_data['profile_fields_user_email_html_tag'] = 'a'; $editor_data['profile_fields_user_email_value_prefix'] = 'mailto:'; $editor_data['profile_fields_user_email_display'] = 'icon'; $editor_data['profile_fields_user_email_display_icon'] = '<span class="dashicons dashicons-email-alt"></span>'; $editor_data['profile_fields_user_email_display_icon_background_color'] = '#655997'; $editor_data['profile_fields_user_email_color'] = '#ffffff'; $editor_data['profile_fields_user_email_display_icon_border_radius'] = '100'; // style website field $editor_data['profile_fields_user_url_html_tag'] = 'a'; $editor_data['profile_fields_user_url_display'] = 'icon'; $editor_data['profile_fields_user_url_display_icon'] = '<span class="dashicons dashicons-admin-links"></span>'; $editor_data['profile_fields_user_url_display_icon_background_color'] = '#655997'; $editor_data['profile_fields_user_url_color'] = '#ffffff'; $editor_data['profile_fields_user_url_display_icon_border_radius'] = '100'; update_post_meta($post->ID, self::META_PREFIX . 'layout_meta_value', $editor_data); } } } public static function authorBoxesMetaDefaultLabelUpdate() { $post_args = [ 'post_type' => self::POST_TYPE_BOXES, 'posts_per_page' => -1, 'post_status' => 'publish', ]; $posts = get_posts($post_args); if (! empty($posts)) { foreach ($posts as $post) { $editor_data = (array) get_post_meta($post->ID, self::META_PREFIX . 'layout_meta_value', true); //meta default $editor_data['meta_label'] = __('View all posts', 'publishpress-authors'); update_post_meta($post->ID, self::META_PREFIX . 'layout_meta_value', $editor_data); } } } public static function authorBoxesFieldsUpdate() { $post_args = [ 'post_type' => self::POST_TYPE_BOXES, 'posts_per_page' => -1, 'post_status' => 'publish', ]; $posts = get_posts($post_args); if (! empty($posts)) { foreach ($posts as $post) { if (in_array($post->post_name, ['author_boxes_simple_list', 'author_boxes_inline', 'author_boxes_inline_avatar'])) { $editor_data = (array) get_post_meta($post->ID, self::META_PREFIX . 'layout_meta_value', true); $editor_data['meta_view_all_show'] = 0; // hide all author fields $profile_fields = apply_filters('multiple_authors_author_fields', [], false); foreach ($profile_fields as $key => $data) { $editor_data['profile_fields_hide_' . $key] = 1; } update_post_meta($post->ID, self::META_PREFIX . 'layout_meta_value', $editor_data); } } } } /** * @param boolean $ids_only * @param boolean $with_editor_data * @return array */ public static function getAuthorBoxes($ids_only = false, $with_editor_data = false, $type = 'all') { $post_args = [ 'post_type' => self::POST_TYPE_BOXES, 'posts_per_page' => -1, 'post_status' => 'publish', 'orderby' => 'menu_order', 'order' => 'ASC' ]; if ($type == 'author_categories') { $post_args['meta_query'] = [ [ 'key' => self::META_PREFIX . 'layout_parent_author_box', 'value' => '', 'compare' => '!=', ], ]; } elseif ($type == 'author_boxes') { $post_args['meta_query'] = [ 'relation' => 'OR', [ 'key' => self::META_PREFIX . 'layout_parent_author_box', 'compare' => 'NOT EXISTS', ], [ 'key' => self::META_PREFIX . 'layout_parent_author_box', 'value' => '', 'compare' => '=', ], ]; } if ($ids_only) { $post_args['fields'] = 'ids'; return get_posts($post_args); } $posts = get_posts($post_args); $author_boxes = []; if (! empty($posts)) { foreach ($posts as $post) { if ($with_editor_data) { $author_boxes[self::POST_TYPE_BOXES . '_' . $post->ID] = self::get_author_boxes_layout_meta_values($post->ID, false); } else { $author_boxes[self::POST_TYPE_BOXES . '_' . $post->ID] = $post->post_title; } } } return $author_boxes; } /** * @return array */ public static function getThemeAuthorBoxes() { $directories = [ STYLESHEETPATH . '/publishpress-authors/author-boxes/', TEMPLATEPATH . '/publishpress-authors/author-boxes/' ]; $directories = array_unique($directories); $theme_author_boxes = []; foreach ($directories as $directory) { $dir_files = self::authorboxesListDirectoryFiles($directory, 1); if (!empty($dir_files)) { foreach ($dir_files as $dir_file) { $file_extension = pathinfo($dir_file, PATHINFO_EXTENSION); $filename = basename($dir_file); $filename = str_ireplace('.php', '', $filename); if ($file_extension === 'php') { $theme_author_boxes[$filename] = self::cleanThemeBoxName($filename) . ' (' . __('Theme', 'publishpress-authors') . ')'; } } } } return $theme_author_boxes; } /** * This is a clone of wordpress 'list_files' that's been caught in undefined function in some themes. * * Returns a listing of all files in the specified folder and all subdirectories up to 100 levels deep. * * The depth of the recursiveness can be controlled by the $levels param. * * @since 2.6.0 * @since 4.9.0 Added the `$exclusions` parameter. * * @param string $folder Optional. Full path to folder. Default empty. * @param int $levels Optional. Levels of folders to follow, Default 100 (PHP Loop limit). * @param string[] $exclusions Optional. List of folders and files to skip. * @return string[]|false Array of files on success, false on failure. */ public static function authorboxesListDirectoryFiles($folder = '', $levels = 100, $exclusions = array()) { if (function_exists('ppma_list_files')) {// wordpress is currently generating error with native list_files. So, we may not use it return list_files($folder, $levels); } else { if (empty($folder)) { return false; } $folder = trailingslashit($folder); if (! $levels) { return false; } $files = array(); if (is_dir($folder)) { $dir = @opendir($folder); while (($file = readdir($dir)) !== false) { // Skip current and parent folder links. if (in_array($file, array( '.', '..' ), true)) { continue; } // Skip hidden and excluded files. if ('.' === $file[0] || in_array($file, $exclusions, true)) { continue; } if (!is_dir($folder . $file)) { $files[] = $folder . $file; } } closedir($dir); } return $files; } } /** * Clean author box name * * @param string $filename * @return string $filename */ private static function cleanThemeBoxName($filename) { $filename = str_ireplace(['-', '_', '.'], ' ', $filename); //Remove all non-alphanumeric and space characters $filename = preg_replace('/[^\da-z ]/i', '', $filename); $filename = trim($filename); $filename = ucwords($filename); return $filename; } /** * Summary of removeExcludedAuthors * @param mixed $authorsList * @return array */ public static function removeExcludedAuthors($authorsList) { $legacyPlugin = Factory::getLegacyPlugin(); $author_boxes_opt_out = $legacyPlugin->modules->multiple_authors->options->author_boxes_opt_out === 'yes'; if (empty($authorsList)) { return []; } if (!$author_boxes_opt_out) { return $authorsList; } foreach ($authorsList as $index => $author) { if ((int)$author->exclude_author === 1) { unset($authorsList[$index]); unset($index); } } $authorsList = array_filter(array_values($authorsList)); return $authorsList; } /** * @param $html * @param $args * * @return string */ public function filterAuthorBoxHtml($html, $args) { $layoutName = sanitize_text_field($args['layout']); $author_box_id = false; if (substr($layoutName, 0, 10) === self::POST_TYPE_BOXES) { $author_box_id = (int) preg_replace("/[^0-9]/", "", $layoutName ); if ($author_box_id === 0) { return $html; } } elseif(in_array($layoutName, ['simple_list', 'centered', 'boxed', 'inline', 'inline_avatar'])) { $legacyPlugin = Factory::getLegacyPlugin(); $legacy_layout_author_box = $legacyPlugin->modules->multiple_authors->options->{'author_legacy_layout_' . $layoutName}; if (empty($legacy_layout_author_box)) { // set the legacy layout setting $author_box_id = $this->getLegacyLayoutAuthorBoxId($layoutName); $legacyPlugin->update_module_option('multiple_authors', 'author_legacy_layout_' . $layoutName, self::POST_TYPE_BOXES . '_' . $author_box_id); if ($author_box_id === 0) { return $html; } } $author_box_id = (int) preg_replace("/[^0-9]/", "", $legacy_layout_author_box ); if ($author_box_id === 0) { return $html; } } else { // Validate the layout name if (!preg_match('/^[a-zA-Z0-9_-]+$/', $layoutName)) { return $html; } //check in theme boxes template $relative_path = 'publishpress-authors/author-boxes/' . $layoutName . '.php'; $box_template = locate_template([$relative_path]); if ($box_template && is_file($box_template) && is_readable($box_template)) { // Get full expected directory path $expected_dirs = [ realpath(get_stylesheet_directory() . '/publishpress-authors/author-boxes'), realpath(get_template_directory() . '/publishpress-authors/author-boxes') ]; // Get resolved path of the template $real_box_template = realpath($box_template); $valid_path = false; foreach ($expected_dirs as $dir) { if (strpos($real_box_template, $dir) === 0) { $valid_path = true; break; } } // Ensure the template is inside the expected directory if ($valid_path) { global $ppma_template_authors, $ppma_template_authors_post; $ppma_template_authors = $args['authors']; $ppma_template_authors_post = isset($args['post']) ? $args['post'] : false; ob_start(); include $box_template; $html = ob_get_clean(); return $html; } } return $html; } $editor_data = self::get_author_boxes_layout_meta_values($author_box_id); if (!is_array($editor_data)) { if (defined('WP_DEBUG') && WP_DEBUG) { error_log( // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log sprintf( '[PublishPress Authors] Author boxes post not found: %s', $layoutName ) ); } return $html; } $post_id = $editor_data['post_id']; $fields = apply_filters('multiple_authors_author_boxes_fields', self::get_fields(get_post($post_id)), get_post($post_id)); $preview_args = []; foreach ($fields as $key => $key_args) { $field_key = $key; $field_value = isset($editor_data[$key]) ? $editor_data[$key] : ''; if ($field_key === 'box_tab_custom_wrapper_class') { $field_value .= ' ' . $args['css_class']; } $key_args['key'] = $field_key; $key_args['value'] = $field_value; $preview_args[$key] = $key_args; } $preview_args['authors'] = $args['authors']; $preview_args['post_id'] = $post_id; $preview_args['short_code_args'] = $args; $html = self::get_rendered_author_boxes_editor_preview($preview_args); return $html; } /** * Get legacy layout author box ID */ public function getLegacyLayoutAuthorBoxId($layout) { $args = [ 'name' => 'author_boxes_' . $layout, 'post_type' => MA_Author_Boxes::POST_TYPE_BOXES, 'post_status' => 'publish', 'posts_per_page' => 1 ]; $layout_post = get_posts($args); if (empty($layout_post)) { //recreate default MA_Author_Boxes::createDefaultAuthorBoxes(); $layout_post = get_posts($args); } if (!empty($layout_post)) { return $layout_post[0]->ID; } return 0; } /** * Add editor metabox * * @return void */ public function addPreviewMetabox() { add_meta_box( self::META_PREFIX . 'preview_area', __('Author Box Preview', 'publishpress-authors'), [$this, 'renderPreviewMetabox'], self::POST_TYPE_BOXES, 'normal', 'high' ); } /** * Add editor metabox * * @return void */ public function addEditorMetabox() { add_meta_box( self::META_PREFIX . 'editor_area', __('Author Box Editor', 'publishpress-authors'), [$this, 'renderEditorMetabox'], self::POST_TYPE_BOXES, 'normal', 'high' ); } /** * Add layout slug metabox * * @return void */ public function addLayoutSlugMetabox() { add_meta_box( self::META_PREFIX . 'layout_slug', __('Layout Slug', 'publishpress-authors'), [$this, 'renderLayoutSLugMetabox'], self::POST_TYPE_BOXES, 'side' ); } /** * Add shortcode metabox * * @return void */ public function addShortcodeMetabox() { add_meta_box( self::META_PREFIX . 'shortcode', __('Shortcode', 'publishpress-authors'), [$this, 'renderShortcodeMetabox'], self::POST_TYPE_BOXES, 'side' ); } /** * Add banner metabox * * @return void */ public function addBannerMetabox() { if (!Utils::isAuthorsProActive()) { add_meta_box( self::META_PREFIX . 'banner', __('Banner', 'publishpress-authors'), [$this, 'renderBannerMetabox'], self::POST_TYPE_BOXES, 'side', 'low' ); } } /** * Get the fields tabs to be rendered in the author box editor * * @param WP_Post $post object. * * @return array */ public static function get_fields_tabs($post) { $fields_tabs = [ 'title' => [ 'label' => __('Box Title', 'publishpress-authors'), 'icon' => 'dashicons dashicons-translation', ], 'avatar' => [ 'label' => __('Avatar', 'publishpress-authors'), 'icon' => 'dashicons dashicons-format-image', ], 'name' => [ 'label' => __('Display Name', 'publishpress-authors'), 'icon' => 'dashicons dashicons-editor-spellcheck', ], 'author_bio' => [ 'label' => __('Biographical Info', 'publishpress-authors'), 'icon' => 'dashicons dashicons-welcome-write-blog', ], 'meta' => [ 'label' => __('View All Posts', 'publishpress-authors'), 'icon' => 'dashicons dashicons-admin-page', ], 'author_categories' => [ 'label' => __('Author Categories', 'publishpress-authors'), 'icon' => 'dashicons dashicons-category', ], 'profile_fields' => [ 'label' => __('Author Fields', 'publishpress-authors'), 'icon' => 'dashicons dashicons-groups', ], 'shortcodes' => [ 'label' => __('Shortcodes', 'publishpress-authors'), 'icon' => 'dashicons dashicons-shortcode', ], 'author_recent_posts' => [ 'label' => __('Author Recent Posts', 'publishpress-authors'), 'icon' => 'dashicons dashicons-admin-page', ], 'box_layout' => [ 'label' => __('Box Layout', 'publishpress-authors'), 'icon' => 'dashicons dashicons-editor-table', ], 'custom_css' => [ 'label' => __('Custom CSS', 'publishpress-authors'), 'icon' => 'dashicons dashicons-editor-code', ], 'export' => [ 'label' => __('Export', 'publishpress-authors'), 'icon' => 'dashicons dashicons-database-export', ], 'import' => [ 'label' => __('Import', 'publishpress-authors'), 'icon' => 'dashicons dashicons-database-import', ], 'generate_template' => [ 'label' => __('Generate Theme Template', 'publishpress-authors'), 'icon' => 'dashicons dashicons-html', ], ]; /** * Customize fields tabs presented in the author boxes editor. * * @param array $fields_tabs Existing fields tabs to display. * @param WP_Post $post object. */ $fields_tabs = apply_filters('authors_boxes_editor_fields_tabs', $fields_tabs, $post); if (!Utils::isAuthorsProActive() || (empty($_GET['author_category_box']) && empty(get_post_meta($post->ID, \MA_Author_Boxes::META_PREFIX . 'layout_parent_author_box', true)))) { unset($fields_tabs['author_categories']); } return $fields_tabs; } /** * Get the fields to be rendered in the author boxes editor * * @param WP_Post $post object. * * @return array */ public static function get_fields($post) { $fields = []; /** * Customize fields presented in the author boxes editor. * * @param array $fields Existing fields to display. * @param WP_Post $post object. */ $fields = apply_filters('author_boxes_editor_fields', $fields, $post); return $fields; } /** * Render layout slug metaboxes * * @param \WP_Post $post * @return void */ public function renderLayoutSLugMetabox(\WP_Post $post) { $layout_slug = self::POST_TYPE_BOXES . '_' . $post->ID; ?> <input type="text" value="<?php echo esc_attr($layout_slug); ?>" readonly /> <?php } /** * Render box metaboxes * * @param \WP_Post $post * @return void */ public function renderBannerMetabox(\WP_Post $post) { Utils::ppma_pro_sidebar(); } /** * Render shortcode metaboxes * * @param \WP_Post $post * @return void */ public function renderShortcodeMetabox(\WP_Post $post) { $layout_slug = self::POST_TYPE_BOXES . '_' . $post->ID; ?> <textarea readonly>[publishpress_authors_box layout="<?php echo esc_attr($layout_slug); ?>"]</textarea> <p class="description"><a href="https://publishpress.com/knowledge-base/shortcodes/" target="blank"><?php esc_html_e('Shortcode documentation.', 'publishpress-authors'); ?></a></p> <?php } /** * Get Author boxes meta value * TODO: Most of options here will be migrated via installer in the next release when deprecating meta * * @param integer $post_id * @param boolean $use_default * @return array $editor_data */ public static function get_author_boxes_layout_meta_values($post_id, $use_default = false) { if ($use_default || empty(get_post_meta($post_id, self::META_PREFIX . 'layout_meta_value', true))) { if (Utils::isAuthorsProActive() && !empty($_GET['author_category_box'])) { $editor_data = \MA_Author_Boxes_Pro::getAuthorBoxesBoxedCategoriesEditorData(); } else { $editor_data = AuthorBoxesDefault::getAuthorBoxesDefaultData('author_boxes_boxed'); } } else { $editor_data = (array) get_post_meta($post_id, self::META_PREFIX . 'layout_meta_value', true); } $editor_data['post_id'] = $post_id; //set social profile defaults $social_fields = ['facebook', 'twitter', 'x', 'instagram', 'linkedin', 'youtube', 'tiktok']; foreach ($social_fields as $social_field) { //set default display to icon if (!isset($editor_data['profile_fields_'.$social_field.'_display']) || (isset($editor_data['profile_fields_'.$social_field.'_display']) && empty($editor_data['profile_fields_'.$social_field.'_display'])) ) { $editor_data['profile_fields_'.$social_field.'_display'] = 'icon'; } //set default ucon value if (!isset($editor_data['profile_fields_'.$social_field.'_display_icon']) || (isset($editor_data['profile_fields_'.$social_field.'_display_icon']) && empty($editor_data['profile_fields_'.$social_field.'_display_icon'])) ) { if ($social_field === 'tiktok') { $editor_data['profile_fields_'.$social_field.'_display_icon'] = '<i class="fab fa-'.$social_field.'"></i>'; } else { $editor_data['profile_fields_'.$social_field.'_display_icon'] = '<span class="dashicons dashicons-'.$social_field.'"></span>'; } } //set social_field profile html tag to 'a' if icon is select if (isset($editor_data['profile_fields_'.$social_field.'_display']) && $editor_data['profile_fields_'.$social_field.'_display'] === 'icon' ) { $editor_data['profile_fields_'.$social_field.'_html_tag'] = 'a'; } //set social_field profile display icon size if (!isset($editor_data['profile_fields_'.$social_field.'_display_icon_size']) || (isset($editor_data['profile_fields_'.$social_field.'_display_icon_size']) && empty($editor_data['profile_fields_'.$social_field.'_display_icon_size'])) ) { $editor_data['profile_fields_'.$social_field.'_display_icon_size'] = '16'; } //set social_field profile display icon background color if (!isset($editor_data['profile_fields_'.$social_field.'_display_icon_background_color'])) { $editor_data['profile_fields_'.$social_field.'_display_icon_background_color'] = '#655997'; } //set social_field profile display icon color if (!isset($editor_data['profile_fields_'.$social_field.'_color'])) { $editor_data['profile_fields_'.$social_field.'_color'] = '#ffffff'; } //set social_field profile display icon border radius if (!isset($editor_data['profile_fields_'.$social_field.'_display_icon_border_radius'])) { $editor_data['profile_fields_'.$social_field.'_display_icon_border_radius'] = '50'; } } return apply_filters('multiple_authors_get_author_boxes_layout_meta_values', $editor_data, $post_id, $use_default); } /** * Render preview metabox * * @param \WP_Post $post * * @return void */ public function renderPreviewMetabox(\WP_Post $post) { $fields = apply_filters('multiple_authors_author_boxes_fields', self::get_fields($post), $post); if ($post->post_status === 'auto-draft') { $editor_data = self::get_author_boxes_layout_meta_values($post->ID, true); } else { $editor_data = self::get_author_boxes_layout_meta_values($post->ID); } $preview_author_post_id = (int) get_post_meta($post->ID, self::META_PREFIX . 'layout_preview_author_post', true); $preview_author_post_obj = ''; if (!empty($preview_author_post_id)) { $preview_author_post_obj = get_post($preview_author_post_id); } if (!is_object($preview_author_post_obj) || !isset($preview_author_post_obj->ID)) { $supported_post_type = Utils::get_post_types_that_support_authors(); $preview_author_posts = get_posts([ 'post_type' => in_array('post', $supported_post_type) ? 'post' : $supported_post_type[0], 'posts_per_page' => 1, 'post_status' => 'publish', 'order' => 'DESC', 'orderby' => 'date', ]); if (!empty($preview_author_posts)) { $preview_author_post_obj = $preview_author_posts[0]; } } if (is_object($preview_author_post_obj) && isset($preview_author_post_obj->ID)) { $preview_author_post = $preview_author_post_obj->ID; $preview_post_title = $preview_author_post_obj->post_title; $preview_post_type = $preview_author_post_obj->post_type; $preview_authors = publishpress_authors_get_post_authors($preview_author_post_obj->ID); } else { $preview_author_post = ''; $preview_post_title = ''; $preview_post_type = ''; $preview_authors = [Author::get_by_user_id(get_current_user_id())]; } /** * Render fields */ $preview_args = []; $preview_args['authors'] = $preview_authors; $preview_args['preview_author_post'] = $preview_author_post; $preview_args['preview_post_title'] = $preview_post_title; $preview_args['preview_post_type'] = $preview_post_type; $preview_args['post_id'] = $editor_data['post_id']; $preview_args['admin_preview'] = true; foreach ($fields as $key => $args) { $args['key'] = $key; $args['value'] = isset($editor_data[$key]) ? $editor_data[$key] : ''; $preview_args[$key] = $args; } ?> <div class="pressshack-admin-wrapper publishpress-author-box-editor"> <div class="preview-section wrapper-column"> <?php /** * Render editor preview */ echo self::get_rendered_author_boxes_editor_preview($preview_args); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> </div> </div> <?php } /** * Render editor metabox * * @param \WP_Post $post * * @return void */ public function renderEditorMetabox(\WP_Post $post) { /** * Filter the fields tabs on the Author boxes editor. * * @param array $tabs * @param WP_Post $post object * * @return array */ $fields_tabs = apply_filters('multiple_authors_author_boxes_fields_tabs', self::get_fields_tabs($post), $post); /** * Filter the fields on the Author boxes editor. * * @param array $fields * @param WP_Post $post object * * @return array */ $fields = apply_filters('multiple_authors_author_boxes_fields', self::get_fields($post), $post); ?> <div class="pressshack-admin-wrapper publishpress-author-box-editor"> <div class="ppma-author-box-editor-tabs"> <ul> <?php /** * Render field tabs */ foreach ($fields_tabs as $key => $args) { $active_tab = ($key === self::default_tab()) ? ' active' : ''; ?> <li> <a data-tab="<?php esc_attr_e($key); ?>" class="<?php esc_attr_e($active_tab); ?>" href="#" > <span class="<?php esc_attr_e($args['icon']); ?>"></span> <span class="item"><?php esc_html_e($args['label']); ?></span> </a> </li> <?php } ?> </ul> </div> <div class="ppma-author-box-editor-fields wrapper-column"> <table class="form-table ppma-author-boxes-editor-table fixed" role="presentation"> <tbody> <?php if ($post->post_status === 'auto-draft') { $editor_data = self::get_author_boxes_layout_meta_values($post->ID, true); } else { $editor_data = self::get_author_boxes_layout_meta_values($post->ID); } /** * Render fields */ foreach ($fields as $key => $args) { $args['key'] = $key; $args['value'] = isset($editor_data[$key]) ? $editor_data[$key] : ''; $args['post_id'] = $post->ID; echo self::get_rendered_author_boxes_editor_partial($args); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } wp_nonce_field('author-boxes-editor', 'author-boxes-editor-nonce'); ?> </tbody> </table> </div> </div> <div id="author-field-icons-modal" style="display: none;"> <div id="author-field-icons-container" class="author-field-icons-container"></div> </div> <?php } /** * Get a rendered editor preview * * @param array $args Arguments to render the preview. */ public static function get_rendered_author_boxes_editor_preview($args) { global $ppma_instance_id, $auto_list_prefix, $ppma_rendered_box_ids, $ppma_custom_styles; ob_start(); if (empty($ppma_rendered_box_ids)) { $ppma_rendered_box_ids = []; } if (empty($ppma_custom_styles)) { $ppma_custom_styles = []; } if (!$ppma_instance_id) { $ppma_instance_id = 1; } else { $ppma_instance_id += 1; } /** * I'm leaving this as 1 as it's not working when generating css, * only one instance is added. Instead, I'll be adding the box additional class * to prevent boxes styles from classing. */ $args['instance_id'] = 1; $args['additional_class'] = str_replace(' ', '.', trim($args['box_tab_custom_wrapper_class']['value'])); //custom styles $custom_styles = ''; $custom_styles = AuthorBoxesStyles::getTitleFieldStyles($args, $custom_styles); $custom_styles = AuthorBoxesStyles::getAvatarFieldStyles($args, $custom_styles); $custom_styles = AuthorBoxesStyles::getNameFieldStyles($args, $custom_styles); $custom_styles = AuthorBoxesStyles::getBioFieldStyles($args, $custom_styles); $custom_styles = AuthorBoxesStyles::getMetaFieldStyles($args, $custom_styles); $custom_styles = AuthorBoxesStyles::getRProfileFieldStyles($args, $custom_styles); $custom_styles = AuthorBoxesStyles::getRecentPostsFieldStyles($args, $custom_styles); $custom_styles = AuthorBoxesStyles::getBoxLayoutFieldStyles($args, $custom_styles); $custom_styles = AuthorBoxesStyles::getAuthorCategoriesFieldStyles($args, $custom_styles); $custom_styles = AuthorBoxesStyles::getCustomCssFieldStyles($args, $custom_styles); $admin_preview = (!empty($args['admin_preview'])) ? true : false; $profile_fields = self::get_profile_fields($args['post_id']); if (($admin_preview || is_admin()) && !empty($args['preview_author_post'])) { global $post; $post = get_post($args['preview_author_post']); } $authors = (isset($args['authors']) && is_array($args['authors']) && !empty($args['authors'])) ? $args['authors'] : []; $authors = self::removeExcludedAuthors($authors); $box_post = get_post($args['post_id']); $box_post_id = (is_object($box_post) && isset($box_post->ID)) ? $box_post->ID : '1'; $li_style = (empty($args['author_inline_display']['value'])) ? true : false; $current_post_id = 0; if (!empty($args['short_code_args']['post']->ID)) { $current_post_id = $args['short_code_args']['post']->ID; } if (!empty($args['preview_author_post'])) { $current_post_id = $args['preview_author_post']; } $author_separator = $args['box_tab_layout_author_separator']['value']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped; $author_counts = count($authors); $body_class = 'pp-multiple-authors-boxes-wrapper pp-multiple-authors-wrapper '. esc_attr($args['box_tab_custom_wrapper_class']['value']) .' box-post-id-'. esc_attr($args['post_id']) .' box-instance-id-'. esc_attr($args['instance_id']) .' ppma_boxes_' . esc_attr($box_post_id); if (is_object($box_post) && isset($box_post->post_name) && $box_post->post_name === 'author_boxes_inline') { $li_style = false; $args['name_html_tag']['value'] = 'span'; } // format author category support $author_categories = get_ppma_author_categories(['category_status' => 1]); $author_categories_data = ppma_get_grouped_post_authors($current_post_id, $authors, $author_categories); $author_categories_group_option = 'inline'; $author_categories_title_option = ''; $author_categories_title_html_tag = 'span'; $author_categories_title_prefix = ''; $author_categories_title_suffix = ''; if (!empty($args['author_categories_group']['value'])) { if (!empty($author_categories)) { $author_categories_group_option = !empty($args['author_categories_group_option']['value']) ? $args['author_categories_group_option']['value'] : 'inline'; $author_categories_title_option = !empty($args['author_categories_title_option']['value']) ? $args['author_categories_title_option']['value'] : ''; $author_categories_title_html_tag = !empty($args['author_categories_title_html_tag']['value']) ? $args['author_categories_title_html_tag']['value'] : 'span'; $author_categories_title_prefix = !empty($args['author_categories_title_prefix']['value']) ? html_entity_decode($args['author_categories_title_prefix']['value']) : ''; $author_categories_title_suffix = !empty($args['author_categories_title_suffix']['value']) ? html_entity_decode($args['author_categories_title_suffix']['value']) : ''; } } $shortcodes_data = !empty($args['shortcodes']['value']) ? $args['shortcodes']['value'] : []; $meta_shortcode_output = ''; $name_shortcode_output = ''; $bio_shortcode_output = ''; $authors_shortcode_output = ''; if (!empty($shortcodes_data) && is_array($shortcodes_data)) { foreach ($shortcodes_data['shortcode'] as $shortcode_index => $shortcode_data) : $shortcode_shortcode = $shortcodes_data['shortcode'][$shortcode_index]; $shortcode_position = $shortcodes_data['position'][$shortcode_index]; $shortcode_html = do_shortcode($shortcode_shortcode); if ($shortcode_position == 'meta') { $meta_shortcode_output .= $shortcode_html; } elseif ($shortcode_position == 'name') { $name_shortcode_output .= $shortcode_html; } elseif ($shortcode_position == 'bio') { $bio_shortcode_output .= $shortcode_html; } elseif ($shortcode_position == 'authors') { $authors_shortcode_output .= $shortcode_html; } endforeach; } ?> <?php if ($admin_preview) : ?> <div class="preview-container"> <div class="live-preview"> <div class="live-preview-box"> <div class="editor-preview-author"> <div class="editor-preview-author-label"> <?php echo esc_html__('Post preview', 'publishpress-authors'); ?> </div> <div class="editor-preview-author-post"> <select data-nonce="<?php echo esc_attr(wp_create_nonce('authors-post-search')); ?>" data-post_type="<?php echo esc_attr($args['preview_post_type']); ?>" class="authors-select2 ppma-authors-post-search" data-placeholder="<?php esc_attr_e('Select Preview Post', 'publishpress-authors'); ?>" name="preview_author_post"> <?php if (!empty($args['preview_author_post'])) : ?> <option value="<?php echo esc_attr($args['preview_author_post']); ?>" selected> <?php echo esc_html($args['preview_post_title']); ?> </option> <?php endif; ?> </select> </div> </div> <?php endif; ?> <?php if (Utils::isAuthorsProActive() && (!empty($_GET['author_category_box']) || !empty(get_post_meta($box_post_id, \MA_Author_Boxes::META_PREFIX . 'layout_parent_author_box', true)))) : $parent_author_box = (!empty($_GET['author_category_box']) ? 'list_author_category_block' : get_post_meta($box_post_id, \MA_Author_Boxes::META_PREFIX . 'layout_parent_author_box', true)); ?> <input type="hidden" name="parent_author_box" class="parent_author_box" value="<?php echo esc_attr($parent_author_box); ?>" /> <?php endif; ?> <!--begin code --> <?php if (isset($args['short_code_args']) && isset($args['short_code_args']['search_box_html']) && !empty($args['short_code_args']['search_box_html'])) : ?> <?php echo $args['short_code_args']['search_box_html']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> <?php endif; ?> <<?php echo ($li_style ? 'div' : 'span'); ?> class="<?php echo esc_attr($body_class); ?>" data-post_id="<?php echo esc_attr($args['post_id']); ?>" data-instance_id="<?php echo esc_attr($args['instance_id']); ?>" data-additional_class="<?php echo esc_attr($args['additional_class']); ?>" data-original_class="pp-multiple-authors-boxes-wrapper pp-multiple-authors-wrapper box-post-id-<?php echo esc_attr($args['post_id']); ?> box-instance-id-<?php echo esc_attr($args['instance_id']); ?>"> <?php if ($args['show_title']['value']) : ?> <?php if ($author_counts > 1) : ?> <<?php echo esc_html($args['title_html_tag']['value']); ?> class="widget-title box-header-title"><?php echo esc_html($args['title_text_plural']['value']); ?></<?php echo esc_html($args['title_html_tag']['value']); ?>> <?php else : ?> <<?php echo esc_html($args['title_html_tag']['value']); ?> class="widget-title box-header-title"><?php echo esc_html($args['title_text']['value']); ?></<?php echo esc_html($args['title_html_tag']['value']); ?>> <?php endif; ?> <?php endif; ?> <span class="ppma-layout-prefix"><?php echo html_entity_decode($args['box_tab_layout_prefix']['value']); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></span> <<?php echo ($li_style ? 'div' : 'span'); ?> class="ppma-author-category-wrap"> <?php $author_category_index = 0; foreach ($author_categories_data as $author_category_data) : ?> <?php if (!empty($author_category_data['authors'])) : if (count($author_category_data['authors']) > 1) { $category_title_output = $author_category_data['title']; } else { $category_title_output = $author_category_data['singular_title']; } ?> <?php if ($author_category_index === 1) : ?> <<?php echo ($author_categories_group_option == 'inline' ? 'span' : 'div'); ?> class="ppma-category-group-other-wraps"> <?php endif; ?> <<?php echo ($author_categories_group_option == 'inline' ? 'span' : 'div'); ?> class="ppma-category-group ppma-category-group-<?php echo esc_attr($author_category_data['id']); ?> category-index-<?php echo esc_attr($author_category_index); ?>"> <?php if ($author_categories_title_option == 'before_group' && !empty($author_category_data['title'])) : ?><?php echo '<' . $author_categories_title_html_tag . ' class="ppma-category-group-title">' . $author_categories_title_prefix . '' . $category_title_output . '' . $author_categories_title_suffix . '</' . $author_categories_title_html_tag . '>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> <?php endif; ?> <?php if ($li_style) : ?> <ul class="pp-multiple-authors-boxes-ul author-ul-<?php echo esc_attr($author_category_index); ?>"> <?php endif; ?> <?php if (!empty($author_category_data['authors'])) : ?> <?php echo esc_html($auto_list_prefix); ?> <?php foreach ($author_category_data['authors'] as $index => $author) : ?> <?php if ($author && is_object($author) && isset($author->term_id)) : ?> <?php if ($args['author_recent_posts_show']['value']) : $author_recent_posts = multiple_authors_get_author_recent_posts( $author, true, $args['author_recent_posts_limit']['value'], $args['author_recent_posts_orderby']['value'], $args['author_recent_posts_order']['value'] ); else : $author_recent_posts = []; endif; $current_author_category = get_ppma_author_category($author, $author_categories_data); //author fields item position $name_row_extra = ''; $bio_row_extra = ''; $meta_row_extra = ''; foreach ($profile_fields as $key => $data) { if (!in_array($key, self::AUTHOR_BOXES_EXCLUDED_FIELDS)) { $profile_show_field = $args['profile_fields_hide_' . $key]['value'] ? false : true; $profile_html_tag = !empty($args['profile_fields_' . $key . '_html_tag']['value']) ? $args['profile_fields_' . $key . '_html_tag']['value'] : 'span'; $profile_display = !empty($args['profile_fields_' . $key . '_display']['value']) ? $args['profile_fields_' . $key . '_display']['value'] : 'icon_prefix_value_suffix'; $profile_value_prefix = $args['profile_fields_' . $key . '_value_prefix']['value']; $profile_display_prefix = $args['profile_fields_' . $key . '_display_prefix']['value']; $profile_display_suffix = $args['profile_fields_' . $key . '_display_suffix']['value']; $profile_display_icon = $args['profile_fields_' . $key . '_display_icon']['value']; $profile_display_position = $args['profile_fields_' . $key . '_display_position']['value']; $profile_before_display_prefix = $args['profile_fields_' . $key . '_before_display_prefix']['value']; $profile_after_display_suffix = $args['profile_fields_' . $key . '_after_display_suffix']['value']; if (empty(trim($profile_display_position))) { $profile_display_position = 'meta'; } if ($data['type'] === 'wysiwyg') { $field_value = $author->$key; } else { $field_value = esc_html($author->$key); } if (empty(trim($field_value))) { continue; } $rel_html = (!empty($data['rel'])) ? 'rel="'. esc_attr($data['rel']) .'"' : ''; $target_html = (!empty($data['target'])) ? 'target="_blank"' : 'target="_self"'; $profile_author_category_content = ''; if (!empty($args['profile_fields_' . $key . '_author_categories']['value'])) : $profile_author_categories_divider = !empty($args['profile_fields_' . $key . '_author_categories_divider']['value']) ? $args['profile_fields_' . $key . '_author_categories_divider']['value'] : ''; if (!empty($current_author_category)) : $profile_author_category_prefix = ''; $profile_author_category_suffix = ''; if ($profile_author_categories_divider == 'colon') { $profile_author_category_prefix = ': '; } elseif ($profile_author_categories_divider == 'bracket') { $profile_author_category_prefix = ' ('; $profile_author_category_suffix = ') '; } elseif ($profile_author_categories_divider == 'square_bracket') { $profile_author_category_prefix = ' ['; $profile_author_category_suffix = '] '; } $profile_author_category_content = '<span class="field-author-category ' . $key . '">' . $profile_author_category_prefix . $current_author_category['singular_title'] . $profile_author_category_suffix . '</span>'; endif; endif; $display_field_value = ''; if ($profile_display === 'icon_prefix_value_suffix') { if (!empty($profile_display_icon)) { $display_field_value .= html_entity_decode($profile_display_icon) . ' '; } if (!empty($profile_display_prefix)) { $display_field_value .= esc_html($profile_display_prefix) . ' '; } if (!empty($field_value)) { $display_field_value .= $field_value . ' '; $display_field_value .= $profile_author_category_content; } if (!empty($profile_display_suffix)) { $display_field_value .= esc_html($profile_display_suffix); } } elseif ($profile_display === 'value') { $display_field_value .= $field_value; } elseif ($profile_display === 'prefix') { $display_field_value .= esc_html($profile_display_prefix); } elseif ($profile_display === 'suffix') { $display_field_value .= esc_html($profile_display_suffix); } elseif ($profile_display === 'icon') { $display_field_value .= html_entity_decode($profile_display_icon) . ' '; } elseif ($profile_display === 'prefix_value_suffix') { if (!empty($profile_display_prefix)) { $display_field_value .= esc_html($profile_display_prefix) . ' '; } if (!empty($field_value)) { $display_field_value .= $field_value . ' '; } if (!empty($profile_display_suffix)) { $display_field_value .= esc_html($profile_display_suffix); } } if ($profile_show_field) : ?> <?php $profile_field_html = ''; if (!empty(trim($profile_before_display_prefix))) { $profile_field_html .= '<span class="ppma-author-field-meta-prefix"> '. $profile_before_display_prefix .' </span>'; } $profile_field_html .= '<'. esc_html($profile_html_tag) .''; $profile_field_html .= ' class="ppma-author-'. esc_attr($key) .'-profile-data ppma-author-field-meta '. esc_attr('ppma-author-field-type-' . $data['type']) .'" aria-label="'. esc_attr(($data['label'])) .'"'; if ($profile_html_tag === 'a') { $profile_field_html .= ' href="'. $profile_value_prefix.$field_value .'" '. $rel_html .' '. $target_html .''; } $profile_field_html .= '>'; if ($profile_show_field) { $profile_field_html .= $display_field_value; } $profile_field_html .= '</'. esc_html($profile_html_tag) .'>'; if (!empty(trim($profile_after_display_suffix))) { $profile_field_html .= '<span class="ppma-author-field-meta-suffix"> '. $profile_after_display_suffix .' </span>'; } ?> <?php if ($profile_display_position === 'name') { $name_row_extra .= $profile_field_html; } elseif ($profile_display_position === 'bio') { $bio_row_extra .= $profile_field_html; } elseif ($profile_display_position === 'meta') { $meta_row_extra .= $profile_field_html; } ?> <?php endif; } } $name_row_extra .= $name_shortcode_output; $bio_row_extra .= $bio_shortcode_output; $meta_row_extra .= $meta_shortcode_output; $display_name_position = !empty($args['display_name_position']['value']) ? $args['display_name_position']['value'] : 'after_avatar'; $display_name_prefix = !empty($args['display_name_prefix']['value']) ? $args['display_name_prefix']['value'] : ''; $display_name_suffix = !empty($args['display_name_suffix']['value']) ? $args['display_name_suffix']['value'] : ''; $display_name_markup = ''; if ($args['name_show']['value']) : $after_name_author_category_content = ''; $before_name_author_category_content = ''; if (!empty($args['name_author_categories']['value'])) : $name_author_categories_divider = !empty($args['name_author_categories_divider']['value']) ? $args['name_author_categories_divider']['value'] : ''; if (!empty($current_author_category)) : $name_author_category_prefix = ''; $name_author_category_suffix = ''; if ($name_author_categories_divider == 'colon') { $name_author_category_prefix = ': '; } elseif ($name_author_categories_divider == 'bracket') { $name_author_category_prefix = ' ('; $name_author_category_suffix = ') '; } elseif ($name_author_categories_divider == 'square_bracket') { $name_author_category_prefix = ' ['; $name_author_category_suffix = '] '; } elseif ($name_author_categories_divider == 'space') { $name_author_category_prefix = ' '; } $name_author_categories_position = !empty($args['name_author_categories_position']['value']) ? $args['name_author_categories_position']['value'] : 'after'; if ($name_author_categories_position == 'after') { $after_name_author_category_content = '<span class="name-author-category">' . $name_author_category_prefix . $current_author_category['singular_title'] . $name_author_category_suffix . '</span>'; } else { if ($name_author_categories_divider == 'colon') { $name_author_category_prefix = ''; $name_author_category_suffix = ': '; } elseif ($name_author_categories_divider == 'space') { $name_author_category_prefix = ''; $name_author_category_suffix = ' '; } $before_name_author_category_content = '<span class="name-author-category">' . $name_author_category_prefix . $current_author_category['singular_title'] . $name_author_category_suffix . '</span>'; } endif; endif; $display_name_markup .= '<'.esc_html($args['name_html_tag']['value']) .' class="pp-author-boxes-name multiple-authors-name">'; ?> <?php if ($author_categories_title_option == 'before_individual' && !empty($author_category_data['title'])) : $display_name_markup .= '<' . $author_categories_title_html_tag . ' class="ppma-category-group-title">' . $author_categories_title_prefix . '' . $author_category_data['singular_title'] . '' . $author_categories_title_suffix . '</' . $author_categories_title_html_tag . '>'; endif; $display_name_markup .= $before_name_author_category_content . '<a href="'. esc_url($author->link) .'" rel="author" title="'. esc_attr($author->display_name) .'" class="author url fn">'. esc_html($display_name_prefix . $author->display_name . $display_name_suffix) .'</a>'. $after_name_author_category_content; if ($author_categories_title_option == 'after_individual' && !empty($author_category_data['title'])) : $display_name_markup .= '<' . $author_categories_title_html_tag . ' class="ppma-category-group-title">' . $author_categories_title_prefix . '' . $author_category_data['singular_title'] . '' . $author_categories_title_suffix . '</' . $author_categories_title_html_tag . '>'; endif; if (count($author_category_data['authors']) > 1 && $index !== count($author_category_data['authors']) - 1) { $display_name_markup .= html_entity_decode($author_separator); } $display_name_markup .= '</'. esc_html($args['name_html_tag']['value']) .'>'; endif; ?> <?php if ($li_style) : ?> <li class="pp-multiple-authors-boxes-li author_index_<?php echo esc_attr($index); ?> author_<?php echo esc_attr($author->slug); ?> <?php echo ($args['avatar_show']['value']) ? 'has-avatar' : 'no-avatar'; ?>"> <?php endif; ?> <?php if ($args['avatar_show']['value']) : ?> <div class="pp-author-boxes-avatar"> <div class="avatar-image"> <?php if ($args['avatar_link']['value']) : ?> <a href="<?php echo esc_url($author->link); ?>" class="author-avatar-link"> <?php endif; ?> <?php if ($author->get_avatar()) : ?> <?php echo $author->get_avatar($args['avatar_size']['value']); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> <?php else : ?> <?php echo get_avatar($author->user_email, $args['avatar_size']['value']); ?> <?php endif; ?> <?php if ($args['avatar_link']['value']) : ?> </a> <?php endif; ?> </div> <?php if ($display_name_position === 'infront_of_avatar') : echo $display_name_markup; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped endif ?> </div> <?php else : $custom_styles .= '.' . str_replace(' ', '.', trim($body_class)) . ' ul li > div:nth-child(1) {flex: 1 !important;}'; endif; if ($display_name_position === 'infront_of_avatar' && ! $args['avatar_show']['value']) : echo '<div class="pp-author-boxes-avatar">' . $display_name_markup . '</div>'; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped endif ?> <<?php echo ($li_style ? 'div' : 'span'); ?> class="pp-author-boxes-avatar-details"> <?php if ($display_name_position === 'after_avatar') : echo $display_name_markup; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped endif ?> <?php echo $name_row_extra ; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> <?php if ($args['author_bio_show']['value']) : ?> <<?php echo esc_html($args['author_bio_html_tag']['value']); ?> class="pp-author-boxes-description multiple-authors-description author-description-<?php echo esc_attr($index); ?>"> <?php if ($args['author_bio_link']['value']) : ?> <a href="<?php echo esc_url($author->link); ?>" title="<?php echo esc_attr__('Author', 'publishpress-authors'); ?>"> <?php endif; ?> <?php echo $author->get_description($args['author_bio_limit']['value']); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> <?php if ($args['author_bio_link']['value']) : ?> </a> <?php endif; ?> </<?php echo esc_html($args['author_bio_html_tag']['value']); ?>> <?php endif; ?> <?php echo $bio_row_extra ; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> <?php if ($args['meta_view_all_show']['value']) : ?> <<?php echo esc_html($args['meta_html_tag']['value']); ?> class="pp-author-boxes-meta multiple-authors-links"> <a href="<?php echo esc_url($author->link); ?>" title="<?php echo esc_attr($args['meta_label']['value']); ?>"> <span><?php echo esc_html($args['meta_label']['value']); ?></span> </a> </<?php echo esc_html($args['meta_html_tag']['value']); ?>> <?php endif; ?> <?php echo $meta_row_extra ; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> <?php if ($args['author_recent_posts_show']['value']) : ?> <div class="pp-author-boxes-recent-posts"> <?php if ($args['author_recent_posts_title_show']['value'] && (!empty($author_recent_posts) || $args['author_recent_posts_empty_show']['value'])) : ?> <div class="pp-author-boxes-recent-posts-title"> <?php echo esc_html__('Recent Posts'); ?> </div> <?php endif; ?> <?php if (!empty($author_recent_posts)) : ?> <div class="pp-author-boxes-recent-posts-items"> <?php foreach($author_recent_posts as $recent_post_id) : ?> <<?php echo esc_html($args['author_recent_posts_html_tag']['value']); ?> class="pp-author-boxes-recent-posts-item"> <span class="dashicons dashicons-media-text"></span> <a href="<?php echo esc_url(get_the_permalink($recent_post_id)); ?>" title="<?php echo esc_attr(get_the_title($recent_post_id)); ?>"> <?php echo esc_html(html_entity_decode(get_the_title($recent_post_id))); ?> </a> </<?php echo esc_html($args['author_recent_posts_html_tag']['value']); ?>> <?php endforeach; ?> </div> <?php else : ?> <?php if ($args['author_recent_posts_empty_show']['value']) : ?> <div class="pp-author-boxes-recent-posts-empty"><?php echo esc_html__('No Recent Posts by this Author', 'publishpress-authors'); ?></div> <?php endif; ?> <?php endif; ?> </div> <?php endif; ?> </<?php echo ($li_style ? 'div' : 'span'); ?>> <?php if (empty($args['name_show']['value']) && count($author_category_data['authors']) > 1 && $index !== count($author_category_data['authors']) - 1) { echo html_entity_decode($author_separator); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } ?> <?php endif; ?> <?php if ($li_style) : ?> </li> <?php endif; ?> <?php endforeach; ?> <?php endif; ?> <?php if ($li_style) : ?> </ul> <?php endif; ?> </<?php echo ($author_categories_group_option == 'inline' ? 'span' : 'div'); ?>> <?php if ( $author_category_index !== 0 && (count($author_categories_data) - 1) === $author_category_index) : ?> </<?php echo ($author_categories_group_option == 'inline' ? 'span' : 'div'); ?>> <?php endif; ?> <?php endif; ?> <?php $author_category_index++; endforeach; ?> </<?php echo ($li_style ? 'div' : 'span'); ?>> <span class="ppma-layout-suffix"><?php echo html_entity_decode($args['box_tab_layout_suffix']['value']); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></span> <?php echo $authors_shortcode_output; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> </<?php echo ($li_style ? 'div' : 'span'); ?>> <!--end code --> <?php if ($admin_preview) : ?> </div> </div> </div> <?php endif; ?> <?php if (isset($args['short_code_args']) && isset($args['short_code_args']['pagination']) && !empty($args['short_code_args']['pagination'])) : ?> <nav class="author-boxes-footer-navigation footer-navigation navigation pagination"> <div class="nav-links"> <?php echo $args['short_code_args']['pagination']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> </div> </nav> <?php endif; ?> <?php Utils::loadLayoutFrontCss(); ?> <?php if ($admin_preview || is_admin()) : ?> <div class="pp-author-boxes-editor-preview-styles"> <style> <?php echo html_entity_decode($custom_styles); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> </style> </div> <?php else : ?> <?php /** * Allow dev to filter style locaction between footer and inline */ $style_location = apply_filters('multiple_authors_author_boxes_style_location', 'footer'); // Ensure the same box style is only stored once if (!in_array($box_post_id, $ppma_rendered_box_ids)) { // Track rendered boxes $ppma_rendered_box_ids[] = $box_post_id; if ($style_location === 'inline') { // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo '<style>' . html_entity_decode($custom_styles) . '</style>'; } else { // Store for footer output $ppma_custom_styles[$box_post_id] = html_entity_decode($custom_styles); } } ?> <?php endif; ?> <?php $auto_list_prefix = '';//reset show by return ob_get_clean(); } /** * Get a rendered field partial * * @param array $args Arguments to render in the partial. */ private static function get_rendered_author_boxes_editor_partial($args) { $defaults = [ 'type' => 'text', 'tab' => self::default_tab(), 'options' => [], 'value' => '', 'label' => '', 'group_title' => '', 'description' => '', 'min' => '', 'max' => '', 'placeholder' => '', 'rows' => '20', 'readonly' => false, 'tabbed' => 0, 'tab_name' => '', 'show_input' => false, 'post_id' => false, 'group_start' => false, 'group_end' => false, ]; $args = array_merge($defaults, $args); $key = $args['key']; $tab_class = 'ppma-boxes-editor-tab-content ppma-' . $args['tab'] . '-tab ' . $args['type'] . ' ppma-editor-'.$key; if ('range' === $args['type'] && $args['show_input']) { $tab_class .= ' double-input'; } if ((int)$args['tabbed'] > 0) { $tab_class .= ' tabbed-content tabbed-content-' . $args['tab_name']; } $tab_style = ($args['tab'] === self::default_tab()) ? '' : 'display:none;'; ob_start(); $generate_tab_title = false; if (in_array($args['type'], ['textarea', 'export_action', 'shortcodes', 'import_action', 'template_action', 'line_break', 'profile_header', 'code_editor'])) { $th_style = 'display: none;'; $colspan = 2; } else { $th_style = ''; $colspan = ''; } ?> <?php if ($args['group_start'] === true) : ?> <tr class="group-title-row <?php echo esc_attr($tab_class); ?>" data-tab="<?php echo esc_attr($args['tab']); ?>" style="<?php echo esc_attr($tab_style); ?>" > <td colspan="2" style="padding-left: 0; padding-right: 0;"> <div class="author-boxes-group-table-wrap"> <div class="table-title"><?php echo esc_html($args['group_title']); ?></div> <table> <?php endif; ?> <tr class="<?php echo esc_attr($tab_class); ?>" data-tab="<?php echo esc_attr($args['tab']); ?>" style="<?php echo esc_attr($tab_style); ?>" > <?php if (!empty($args['label'])) : ?> <th scope="row" style="<?php echo esc_attr($th_style); ?>"> <label for="<?php echo esc_attr($key); ?>"> <?php echo esc_html($args['label']); ?> </label> </th> <?php endif; ?> <td class="input" colspan="<?php echo esc_attr($colspan); ?>"> <?php if ('number' === $args['type']) : ?> <input name="<?php echo esc_attr($key); ?>" id="<?php echo esc_attr($key); ?>" type="<?php echo esc_attr($args['type']); ?>" value="<?php echo esc_attr($args['value']); ?>" min="<?php echo esc_attr($args['min']); ?>" max="<?php echo esc_attr($args['max']); ?>" placeholder="<?php echo esc_attr($args['placeholder']); ?>" <?php echo (isset($args['readonly']) && $args['readonly'] === true) ? 'readonly' : ''; ?> /> <?php elseif ('checkbox' === $args['type']) : ?> <input name="<?php echo esc_attr($key); ?>" id="<?php echo esc_attr($key); ?>" type="<?php echo esc_attr($args['type']); ?>" value="1" <?php echo (isset($args['readonly']) && $args['readonly'] === true) ? 'readonly' : ''; ?> <?php checked($args['value'], 1); ?> /> <?php elseif ('select' === $args['type']) : ?> <select name="<?php echo esc_attr($key); ?>" id="<?php echo esc_attr($key); ?>" placeholder="<?php echo esc_attr($args['placeholder']); ?>" <?php echo (isset($args['readonly']) && $args['readonly'] === true) ? 'readonly' : ''; ?> /> <?php foreach ($args['options'] as $key => $label) : ?> <option value="<?php echo esc_attr($key); ?>" <?php selected($key, $args['value']); ?>> <?php echo esc_html($label); ?> </option> <?php endforeach; ?> </select> <?php elseif ('optgroup_select' === $args['type']) : ?> <select name="<?php echo esc_attr($key); ?>" id="<?php echo esc_attr($key); ?>" placeholder="<?php echo esc_attr($args['placeholder']); ?>" <?php echo (isset($args['readonly']) && $args['readonly'] === true) ? 'readonly' : ''; ?> /> <?php foreach ($args['options'] as $group_key => $group_option) : ?> <optgroup label="<?php echo esc_attr($group_option['title']); ?>"> <?php foreach ($group_option['options'] as $key => $label) : ?> <option value="<?php echo esc_attr($key); ?>" <?php selected($key, $args['value']); ?>> <?php echo esc_html($label); ?> </option> <?php endforeach; ?> </optgroup> <?php endforeach; ?> </select> <?php elseif ('color' === $args['type']) : ?> <input name="<?php echo esc_attr($key); ?>" class="pp-editor-color-picker" id="<?php echo esc_attr($key); ?>" type="text" value="<?php echo esc_attr($args['value']); ?>" /> <?php elseif ('shortcodes' === $args['type']) : $shortcodes_data = $args['value']; $shortcode_positions = [ 'meta' => esc_html__('After View all posts Row', 'publishpress-authors'), 'name' => esc_html__('After Name Row', 'publishpress-authors'), 'bio' => esc_html__('After Biographical Info Row', 'publishpress-authors'), 'authors' => esc_html__('After All Authors', 'publishpress-authors') ]; ?> <div class="ppma-boxes-shortcodes-wrap"> <div class="shortcode-entries"> <table class="shortcode-table fixed"> <thead> <tr> <th><?php echo esc_html__('Shortcode', 'publishpress-authors'); ?> <span class="required">*</span></th> <th><?php echo esc_html__('Position', 'publishpress-authors'); ?></th> <th class="action"><?php echo esc_html__('Action', 'publishpress-authors'); ?></th> </tr> </thead> <tbody> <tr class="shortcode-form"> <td class="shortcode-field"> <textarea name="<?php echo esc_attr($key); ?>-shortcode-input" id="<?php echo esc_attr($key); ?>-shortcode-input" class="<?php echo esc_attr($key); ?>-shortcode-input" placeholder="<?php echo esc_attr__('Shortcode', 'publishpress-authors'); ?>" ></textarea> </td> <td class="shortcode-field"> <select name="<?php echo esc_attr($key); ?>-position-input" id="<?php echo esc_attr($key); ?>-position-input" class="<?php echo esc_attr($key); ?>-position-input" /> <?php foreach ($shortcode_positions as $position_key => $position_label) : ?> <option value="<?php echo esc_attr($position_key); ?>" <?php selected($position_key, 'authors'); ?>> <?php echo esc_html($position_label); ?> </option> <?php endforeach; ?> </select> </td> <td class="shortcode-field"> <div class="add-new-shortcode button" data-delete="<?php echo esc_attr__('Delete', 'publishpress-authors'); ?>"> <?php echo esc_html__('Add', 'publishpress-authors'); ?> </div> </td> </tr> <?php if (is_array($shortcodes_data) && !empty($shortcodes_data)) : ?> <?php foreach ($shortcodes_data['shortcode'] as $shortcode_index => $shortcode_data) : $shortcode_shortcode = $shortcodes_data['shortcode'][$shortcode_index]; $shortcode_position = $shortcodes_data['position'][$shortcode_index]; ?> <tr class="shortcode-entry"> <td class="shortcode"> <?php echo esc_html($shortcode_shortcode); ?> </td> <td class="position"> <?php echo esc_html(ucfirst($shortcode_position)); ?> </td> <td class="action"> <input name="<?php echo esc_attr($key); ?>[shortcode][]" id="<?php echo esc_attr($key); ?>-shortcode" type="hidden" value="<?php echo esc_attr($shortcode_shortcode); ?>" /> <input name="<?php echo esc_attr($key); ?>[position][]" id="<?php echo esc_attr($key); ?>-position" type="hidden" value="<?php echo esc_attr($shortcode_position); ?>" /> <span class="delete-shortcode"> <?php echo esc_html__('Delete', 'publishpress-authors'); ?> </span> </td> </tr> <?php endforeach; ?> <?php endif; ?> </tbody> </table> </div> </div> <p class="description"><?php echo sprintf(esc_html__('You can use basic HTML in this field. For example: Read Time %1s.', 'publishpress-authors'), '[read_time_shortcode]'); ?></p> <?php elseif ('export_action' === $args['type']) : ?> <h2 class="title"><?php echo esc_html__('Export Editor Settings', 'publishpress-authors'); ?></h2> <p class="description"><?php echo esc_html__('You can use this data to export your author box design and import it to a new site.', 'publishpress-authors'); ?></p> <textarea name="<?php echo esc_attr($key); ?>" id="<?php echo esc_attr($key); ?>" type="<?php echo esc_attr($args['type']); ?>" rows="<?php echo esc_attr($args['rows']); ?>" placeholder="<?php echo esc_attr($args['placeholder']); ?>" <?php echo (isset($args['readonly']) && $args['readonly'] === true) ? 'readonly' : ''; ?> ></textarea> <div> <a href="#" data-target_input="<?php echo esc_attr($key); ?>" class="button button-secondary ppma-editor-copy-clipboard"> <?php echo esc_html__('Copy to Clipboard', 'publishpress-authors'); ?> </a> </div> <div class="ppma-editor-copied-to-clipboard"> <?php echo esc_attr__('Copied to Clipboard!', 'publishpress-authors'); ?> </div> <?php elseif ('import_action' === $args['type']) : ?> <h2 class="title"><?php echo esc_html__('Import Editor Settings', 'publishpress-authors'); ?></h2> <p class="description"><?php echo esc_html__('Paste the editor data from the "Export" tab on another site.', 'publishpress-authors'); ?></p> <textarea name="<?php echo esc_attr($key); ?>" id="<?php echo esc_attr($key); ?>" type="<?php echo esc_attr($args['type']); ?>" rows="<?php echo esc_attr($args['rows']); ?>" placeholder="<?php echo esc_attr($args['placeholder']); ?>" <?php echo (isset($args['readonly']) && $args['readonly'] === true) ? 'readonly' : ''; ?> ></textarea> <div> <a data-invalid="<?php echo esc_attr__('Invalid data', 'publishpress-authors'); ?>" data-success="<?php echo esc_attr__('Settings Imported Successfully!', 'publishpress-authors'); ?>" href="#" class="button button-secondary ppma-editor-data-import"> <?php echo esc_html__('Import Data', 'publishpress-authors'); ?> </a> </div> <div class="ppma-editor-data-imported"> <?php echo esc_attr__('Settings Imported Successfully!', 'publishpress-authors'); ?> </div> <?php elseif ('template_action' === $args['type']) : ?> <h2 class="title"><?php echo esc_html__('How to generate and use a theme template file', 'publishpress-authors'); ?></h2> <div class="input-area-text"> <ul class="template-generator-instruction"> <li><?php echo esc_html__('Click the "Generate Template" button under the text area. Wait for the code to be generated.', 'publishpress-authors'); ?></li> <li><?php echo sprintf(esc_html__('Create an empty php template file with your desired file slug in the %1s /publishpress-authors/author-boxes/ %2s folder of your theme. %3s For example, the file can be located here: %4s /wp-content/themes/%5syour-theme-name%6s/publishpress-authors/author-boxes/my-first-custom-author-template.php %7s .', 'publishpress-authors'), '<font color="red">', '</font>', '<br />', '<font color="red">', '<strong>', '</strong>', '</font>'); ?></li> <li><?php echo esc_html__('Copy the generated code and paste it inside the newly created file.', 'publishpress-authors'); ?></li> <li><?php echo sprintf(esc_html__('Congratulations. Your can now choose your template inside the PublishPress Authors Settings.', 'publishpress-authors'), '<font color="red">', '</font>'); ?></li> </ul> <p><?php printf( esc_html__('You can read more information on the %s.'), '<a href="https://publishpress.com/knowledge-base/author-boxes-theme-templates/" target="_blank">' . esc_html__( 'documentation page', 'publishpress-authors' ) . '</a>' ); ?> </p> <br /> </div> <textarea name="<?php echo esc_attr($key); ?>" id="<?php echo esc_attr($key); ?>" type="<?php echo esc_attr($args['type']); ?>" rows="<?php echo esc_attr($args['rows']); ?>" placeholder="<?php echo esc_attr($args['placeholder']); ?>" data-editor_mode="php" class="ppma-author-code-editor" <?php echo (isset($args['readonly']) && $args['readonly'] === true) ? 'readonly' : ''; ?>></textarea> <br /> <div class="clear-code-editor-content"></div> <div class="update-code-editor-content"></div> <div class="refresh-code-editor"></div> <div class="generate-template-buttons"> <span> <a href="#" class="button button-primary ppma-editor-generate-template"> <?php echo esc_html__('Generate Template', 'publishpress-authors'); ?> </a> <span class="author-editor-loading-spinner spinner"></span> </span> <span> <a href="#" data-target_input="<?php echo esc_attr($key); ?>" class="button button-secondary ppma-editor-copy-clipboard"> <?php echo esc_html__('Copy to Clipboard', 'publishpress-authors'); ?> </a> </span> </div> <div class="ppma-editor-copied-to-clipboard"> <?php echo esc_attr__('Copied to Clipboard!', 'publishpress-authors'); ?> </div> <div class="ppma-editor-template-generated"> <?php echo esc_attr__('Template generated successfuly!', 'publishpress-authors'); ?> </div> <?php elseif ('textarea' === $args['type']) : ?> <textarea name="<?php echo esc_attr($key); ?>" id="<?php echo esc_attr($key); ?>" type="<?php echo esc_attr($args['type']); ?>" rows="<?php echo esc_attr($args['rows']); ?>" placeholder="<?php echo esc_attr($args['placeholder']); ?>" <?php echo (isset($args['readonly']) && $args['readonly'] === true) ? 'readonly' : ''; ?> ><?php echo esc_html($args['value']); ?></textarea> <?php elseif ('code_editor' === $args['type']) : ?> <label for="<?php echo esc_attr($key); ?>" class="code-editor-label"> <?php echo esc_html($args['label']); ?> </label> <div class="code-mirror-before"><div><?php echo htmlentities('<style type="text/css">'); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></div></div> <textarea name="<?php echo esc_attr($key); ?>" id="<?php echo esc_attr($key); ?>" type="<?php echo esc_attr($args['type']); ?>" rows="<?php echo esc_attr($args['rows']); ?>" placeholder="<?php echo esc_attr($args['placeholder']); ?>" data-editor_mode="<?php echo esc_attr($args['editor_mode']); ?>" class="ppma-author-code-editor" <?php echo (isset($args['readonly']) && $args['readonly'] === true) ? 'readonly' : ''; ?>><?php echo esc_html($args['value']); ?></textarea> <div class="code-mirror-after"><div><?php echo htmlentities('</style>'); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></div></div> <br /> <div class="clear-code-editor-content"></div> <div class="update-code-editor-content"></div> <div class="refresh-code-editor"></div> <?php elseif ('profile_header' === $args['type']) : $additional_class = 'closed'; //$additional_class .= (int)$args['index'] === 1 ? 'opened' : 'closed'; $additional_class .= ' profile-header-' .$args['tab_name']; ?> <?php if ((int)$args['index'] === 1) : ?> <div class="ppma-editor-field-reorder-btn"> <span class="dashicons dashicons-admin-generic"></span> <?php esc_html_e('Reorder Fields', 'publishpress-authors'); ?> </div> <?php $profile_fields = self::get_profile_fields($args['post_id']); $modal_content = ''; $modal_content .= '<div class="ppma-editor-order-form">'; $modal_content .= '<p class="description">'; $modal_content .= __('Reorder the fields by dragging them to the correct position and saving your changes.', 'publishpress-authors'); $modal_content .= '</p>'; $modal_content .= '<div class="ppma-re-order-lists">'; foreach ($profile_fields as $key => $data) { if (!in_array($key, MA_Author_Boxes::AUTHOR_BOXES_EXCLUDED_FIELDS)) { $modal_content .= '<div class="field-sort-item"><h2>'; $modal_content .= $data['label']; $modal_content .= '<input type="hidden" class="sort-field-names" value="'. esc_attr($key) .'">'; $modal_content .= '</h2></div>'; } } $modal_content .= '</div>'; $modal_content .= '<div class="submit-wrapper">'; $modal_content .= '<button class="button button-primary update-order" data-save="current">'; $modal_content .= __('Save for Current Author Box', 'publishpress-authors'); $modal_content .= '<div class="spinner"></div>'; $modal_content .= '</button>'; $modal_content .= '<button class="button button-secondary update-order" data-save="all">'; $modal_content .= __('Save for All Author Boxes', 'publishpress-authors'); $modal_content .= '<div class="spinner"></div>'; $modal_content .= '</button>'; $modal_content .= '</div>'; $modal_content .= '<div class="ppma-order-response-message"></div>'; $modal_content .= '</div>'; Utils::loadThickBoxModal('ppma-field-reorder-thickbox-btn', 'initial', 'initial', $modal_content); ?> <?php endif; ?> <div class="ppma-editor-profile-header-title <?php echo esc_attr($additional_class); ?>" data-fields_name="<?php echo esc_attr($args['tab_name']); ?>"> <h2 class="title-text"> <?php echo esc_html($args['label']); ?> </h2> <div class="title-toggle"> <button type="button"> <span class="toggle-indicator" aria-hidden="true"></span> </button> </div> </div> <?php elseif ('icon' === $args['type']) : $selected_icon = $args['value']; $button_select = sprintf(esc_html__('Select %1s', 'publishpress-authors'), ' ' . $args['label']); $button_change = sprintf(esc_html__('Change %1s', 'publishpress-authors'), ' ' . $args['label']); $button_remove = sprintf(esc_html__('Remove %1s', 'publishpress-authors'), ' ' . $args['label']); $default_text = empty($selected_icon) ? $button_select : $button_change; $remove_style = empty($selected_icon) ? 'display: none;' : ''; $field_name = ucwords(str_replace('_', ' ', $args['tab_name'])); ?> <input name="<?php echo esc_attr($key); ?>" style="display: none;" id="<?php echo esc_attr($key); ?>" type="<?php echo esc_attr($args['type']); ?>" value="<?php echo esc_attr($args['value']); ?>" placeholder="<?php echo esc_attr($args['placeholder']); ?>" <?php echo (isset($args['readonly']) && $args['readonly'] === true) ? 'readonly' : ''; ?> /> <div class="author-boxes-field-icon"> <div class="selected-field-icon action-button" style="<?php echo esc_attr($remove_style); ?>"> <?php if (!empty($selected_icon)) : ?> <?php echo $selected_icon; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?> <?php endif; ?> </div> <div class="select-new-button action-button" data-button_text="<?php echo esc_attr($default_text); ?>" data-button_select="<?php echo esc_attr($button_select); ?>" data-button_change="<?php echo esc_attr($button_change); ?>" data-field_name="<?php echo esc_attr($field_name); ?>" data-input_id="<?php echo esc_attr($key); ?>" data-search_placeholder="<?php echo sprintf(esc_attr__('Search %1s Icon', 'publishpress-authors'), $field_name); ?>" > <div class="button-secondary"><?php echo esc_html($default_text); ?></div> </div> <div class="remove-icon-button action-button" style="<?php echo esc_attr($remove_style); ?>"> <div class="button-secondary"><?php echo esc_html($button_remove); ?></div> </div> </div> <?php else : ?> <input name="<?php echo esc_attr($key); ?>" id="<?php echo esc_attr($key); ?>" type="<?php echo esc_attr($args['type']); ?>" value="<?php echo esc_attr($args['value']); ?>" placeholder="<?php echo esc_attr($args['placeholder']); ?>" <?php echo (isset($args['readonly']) && $args['readonly'] === true) ? 'readonly' : ''; ?> /> <?php endif; ?> <?php if (isset($args['description']) && !empty($args['description'])) : ?> <?php if($args['type'] !== 'checkbox') : ?> <br /> <?php endif; ?> <span class="field-description description"> <?php echo $args['description']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></span> </span> <?php endif; ?> </td> </tr> <?php if ($args['group_end'] === true) : ?> </table> </div> </td> </tr> <?php endif; ?> <?php return ob_get_clean(); } /** * Enqueue Admin Scripts * * @return void */ public function enqueueAdminScripts() { global $pagenow, $post_type, $post; if (! in_array($pagenow, ['post.php', 'post-new.php']) || $post_type !== self::POST_TYPE_BOXES ) { return; } $author = Author::get_by_user_id(get_current_user_id()); $moduleAssetsUrl = PP_AUTHORS_URL . 'src/modules/author-boxes/assets'; //color picker style wp_enqueue_style('wp-color-picker'); //add code editor wp_enqueue_code_editor(['type' => 'text/html']); wp_enqueue_style( 'codemirror-monokai', PP_AUTHORS_ASSETS_URL . 'lib/codemirror/css/monokai.min.css', [], PP_AUTHORS_VERSION ); wp_enqueue_script( 'js-beautify', PP_AUTHORS_ASSETS_URL . 'lib/js-beautify/js/beautify-css.min.js', [], PP_AUTHORS_VERSION, true ); add_thickbox(); wp_enqueue_script( 'author-boxes-editor-js', $moduleAssetsUrl . '/js/author-boxes-editor.js', [ 'jquery', 'code-editor', 'wp-color-picker', 'jquery-ui-sortable', 'js-beautify' ], PP_AUTHORS_VERSION ); $localized_data = [ 'post_id' => $post->ID, 'author_term_id' => $author->term_id, 'nonce' => wp_create_nonce('author-boxes-request-nonce'), 'author_boxes' => $this->getAuthorBoxes(false, true) ]; if (Utils::isAuthorsProActive()) { $localized_data = array_merge($localized_data, \MA_Author_Boxes_Pro::getAuthorBoxesDefaultData()); } $profile_fields = self::get_profile_fields($post->ID); $profile_fields_keys = []; foreach ($profile_fields as $key => $data) { if (!in_array($key, self::AUTHOR_BOXES_EXCLUDED_FIELDS)) { $profile_fields_keys[] = $key; $localized_data[$key] = $author->$key; } } $localized_data['profileFields'] = wp_json_encode($profile_fields_keys); wp_localize_script( 'author-boxes-editor-js', 'authorBoxesEditor', $localized_data ); wp_enqueue_style( 'author-boxes-editor-css', $moduleAssetsUrl . '/css/author-boxes-editor.css', [], PP_AUTHORS_VERSION ); } /** * Get author box profile fields sorted by box author field order * * @param mixed $author_box * @param mixed $author * * @return array */ public static function get_profile_fields($author_box = false, $author = false) { $profile_fields = Author_Editor::get_fields($author); $profile_fields = apply_filters('multiple_authors_author_fields', $profile_fields, false); if ($author_box && (int)$author_box > 0) { $author_fields_order = get_post_meta($author_box, self::META_PREFIX . 'author_fields_order', true); $profile_fields_keys = array_keys($profile_fields); if (!empty($author_fields_order) && is_array($author_fields_order)) { $possible_new_fields = array_diff($profile_fields_keys, $author_fields_order); $current_field_sort = array_merge($possible_new_fields, $author_fields_order); $ordered_fields = []; foreach ($current_field_sort as $field_key) { if (isset($profile_fields[$field_key])) { $ordered_fields[$field_key] = $profile_fields[$field_key]; } } $profile_fields = $ordered_fields; } } return $profile_fields; } /** * Add Author box styles * * @return void */ public function addAuthorBoxStyles() { global $ppma_custom_styles; if (!empty($ppma_custom_styles) && is_array($ppma_custom_styles)) { // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo '<style id="mutliple-author-box-inline-style">' . implode('', array_values($ppma_custom_styles)) . '</style>'; } } /** * Add inline script * * @return void */ public function addInlineScripts() { global $pagenow, $current_screen; if (in_array($pagenow, ['post.php', 'edit.php']) && $current_screen && !empty($current_screen->post_type) && $current_screen->post_type === self::POST_TYPE_BOXES ) { if ($pagenow === 'edit.php' && Utils::getDefaultLayout() === 'boxed') { // recreate default boxes self::createDefaultAuthorBoxes(); } ?> <script> jQuery(document).ready(function ($) { // add author category box button $(".page-title-action").after('<a href="<?php echo esc_url(admin_url('post-new.php?author_category_box=1&post_type=' . self::POST_TYPE_BOXES)); ?>" class="page-title-action author-category-boxes-btn"><?php esc_html_e('New Author Categories Box', 'publishpress-authors'); ?></a>'); }); </script> <?php if (!Utils::isAuthorsProActive()) : ?> <?php $modal_content = ''; $modal_content .= '<div class="new-acb-upgrade-notice">'; $modal_content .= '<p>'; $modal_content .= __('PublishPress Authors Pro allows you to unlock the full potential of Author Categories.', 'publishpress-authors'); $modal_content .= '<br />'; $modal_content .= __('You can create Author Boxes where Authors are grouped into their categories.', 'publishpress-authors'); $modal_content .= '</p>'; $modal_content .= '<p>'; $modal_content .= '<a class="upgrade-link" href="https://publishpress.com/links/authors-banner" target="_blank">'. __('Upgrade to Pro', 'publishpress-authors') .'</a>'; $modal_content .= '</p>'; $modal_content .= '</div>'; Utils::loadThickBoxModal('ppma-new-acb-thickbox-botton', 500, 230, $modal_content); ?> <script> jQuery(document).ready(function ($) { $(".author-category-boxes-btn") .attr('href', '#'); $(document).on('click', '.author-category-boxes-btn', function (e) { e.preventDefault(); $('.ppma-new-acb-thickbox-botton').trigger('click'); return; }); }); </script> <?php endif; } } /** * Sort author boxes by order * * @param object $query * @return void */ public function author_author_boxes_default_sort($query) { if (is_admin() && $query->is_main_query() && $query->get('post_type') === self::POST_TYPE_BOXES) { if (!$query->get('orderby')) { $query->set('orderby', 'menu_order'); $query->set('order', 'ASC'); } } } /** * Enqueue block editor assets */ public function author_boxes_block_enqueue_assets() { wp_enqueue_script( 'author-boxes-block', PP_AUTHORS_URL . 'src/assets/js/author-boxes-block.min.js', ['wp-blocks', 'wp-element', 'wp-editor', 'wp-components', 'wp-data'], PP_AUTHORS_VERSION ); wp_localize_script( 'author-boxes-block', 'authorBoxesBlock', array( 'ajax_url' => admin_url( 'admin-ajax.php' ), 'block_title' => __('Author Box', 'publishpress-authors'), 'select_label' => __('Select an author box', 'publishpress-authors'), )); wp_enqueue_style( 'multiple-authors-widget-css', PP_AUTHORS_ASSETS_URL . 'css/multiple-authors-widget.css', ['wp-edit-blocks'], PP_AUTHORS_VERSION, 'all' ); } /** * Register block */ public function author_boxes_block_register() { register_block_type( 'publishpress-authors/author-boxes-block', [ 'editor_script' => 'author-boxes-block', 'editor_style' => 'multiple-authors-widget-css', 'render_callback' => [$this, 'author_boxes_block_render'], 'attributes' => [ 'selectedBoxId' => [ 'type' => 'string' ], ], ]); } /** * Render callback for the block */ public function author_boxes_block_render( $attributes ) { $layout = !empty( $attributes['selectedBoxId']) ? sanitize_text_field($attributes['selectedBoxId']) : 'boxed'; $html_output = do_shortcode('[publishpress_authors_box layout="'. $layout .'"]'); return $html_output; } /** * AJAX handler for fetching author boxes */ public function ppma_block_fetch_author_boxes() { $author_boxes = $this->getAuthorBoxes(false); $boxes = []; if (!empty($author_boxes)) { foreach ($author_boxes as $box_id => $box_title) { $boxes[] = array( 'id' => $box_id, 'title' => $box_title, ); } } wp_send_json($boxes); } }