proActive = Utilities::isProActive(); $this->initHooks(); } /** * Initialize WordPress hooks */ private function initHooks() { add_action('init', [$this, 'registerAutoInsertPostType']); add_action('save_post', [$this, 'saveAutoInsertRule']); add_filter('the_content', [$this, 'autoInsertBlocks'], -10); add_filter('parent_file', [$this, 'setAutoInsertMenuParent']); add_filter('submenu_file', [$this, 'setAutoInsertSubmenuFile']); add_action('admin_notices', [$this, 'displayAdminNotices']); // AJAX handlers add_action('wp_ajax_advgb_search_taxonomy_terms', [$this, 'searchTaxonomyTerms']); add_action('wp_ajax_advgb_insert_search_author', [$this, 'searchUsers']); add_action('wp_ajax_advgb_insert_search_block', [$this, 'searchBlocks']); add_action('wp_ajax_advgb_insert_search_posts', [$this, 'searchPosts']); // Column hooks add_filter('manage_advgb_insert_block_posts_columns', [$this, 'addAutoInsertColumns']); add_action('manage_advgb_insert_block_posts_custom_column', [$this, 'populateAutoInsertColumns'], 10, 2); add_action('admin_head-edit.php', [$this, 'remove_quick_edit_row']); add_filter('post_row_actions', [$this, 'addDuplicateAction'], 10, 2); add_action('admin_post_duplicate_auto_insert_block', [$this, 'handleDuplicateAction']); add_action('months_dropdown_results', [$this, 'removeMonthFilters'], 10, 2); // Scripts and styles add_action('admin_enqueue_scripts', [$this, 'enqueueAdminAssets']); } /** * Enqueue assets for auto insert blocks pages */ public function enqueueAdminAssets($hook) { global $post_type; if ($post_type === 'advgb_insert_block' && ($hook === 'edit.php' || $hook === 'post.php' || $hook === 'post-new.php')) { AdvancedGutenbergMain::commonAdminPagesAssets(); wp_enqueue_style( 'advgb_auto_insert_admin_css', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/css/auto-insert-admin.css', [], ADVANCED_GUTENBERG_VERSION ); wp_enqueue_style( 'ppma_selet2_css', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/lib/ppma-select2/css/select2-full.min.css', [], ADVANCED_GUTENBERG_VERSION ); wp_enqueue_script( 'ppma_selet2_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/lib/ppma-select2/js/select2-full.min.js', ['jquery'], ADVANCED_GUTENBERG_VERSION ); wp_enqueue_script( 'advgb_auto_insert_admin_js', ADVANCED_GUTENBERG_PLUGIN_DIR_URL . 'assets/js/auto-insert-admin.js', ['jquery', 'ppma_selet2_js'], ADVANCED_GUTENBERG_VERSION ); wp_localize_script( 'advgb_auto_insert_admin_js', 'advgbAutoInsertI18n', [ 'nonce' => wp_create_nonce('advgb_auto_insert_nonce'), 'proVer' => $this->proActive, 'select2' => [ 'errorLoading' => __('The results could not be loaded.', 'advanced-gutenberg'), 'inputTooLong' => [ 'one' => __('Please delete 1 character', 'advanced-gutenberg'), /* translators: %s: number of characters. */ 'other' => __('Please delete %s characters', 'advanced-gutenberg'), ], 'inputTooShort' => [ 'one' => __('Please enter 1 or more characters', 'advanced-gutenberg'), /* translators: %s: number of characters. */ 'other' => __('Please enter %s or more characters', 'advanced-gutenberg'), ], 'loadingMore' => __('Loading more results...', 'advanced-gutenberg'), 'maximumSelected' => [ 'one' => __('You can only select 1 item', 'advanced-gutenberg'), /* translators: %s: number of items. */ 'other' => __('You can only select %s items', 'advanced-gutenberg'), ], 'noResults' => __('No results found', 'advanced-gutenberg'), 'searching' => __('Searching...', 'advanced-gutenberg'), 'removeAllItems' => __('Remove all items', 'advanced-gutenberg'), 'removeItem' => __('Remove item', 'advanced-gutenberg'), 'search' => __('Search', 'advanced-gutenberg'), ], ] ); } } /** * Register auto insert blocks post type */ public function registerAutoInsertPostType() { if (!Utilities::settingIsEnabled('auto_insert_blocks')) { return; } register_post_type('advgb_insert_block', array( 'labels' => array( 'name' => __('Auto Insert Blocks', 'advanced-gutenberg'), 'singular_name' => __('Auto Insert Block', 'advanced-gutenberg'), 'add_new' => __('Add New Rule', 'advanced-gutenberg'), 'add_new_item' => __('Add New Auto Insert Block', 'advanced-gutenberg'), 'edit_item' => __('Edit Auto Insert Block', 'advanced-gutenberg'), 'new_item' => __('New Auto Insert Block', 'advanced-gutenberg'), 'view_item' => __('View Auto Insert Block', 'advanced-gutenberg'), 'search_items' => __('Search Auto Insert Blocks', 'advanced-gutenberg'), 'not_found' => __('No auto insert blocks found', 'advanced-gutenberg'), 'not_found_in_trash' => __('No auto insert blocks found in trash', 'advanced-gutenberg'), ), 'public' => false, 'show_ui' => true, 'show_in_menu' => false, 'capability_type' => 'post', 'supports' => array('title'), 'can_export' => false, 'show_in_admin_bar' => false, 'show_in_nav_menus' => false, 'publicly_queryable' => false, 'exclude_from_search' => true, 'has_archive' => false, 'query_var' => false, 'rewrite' => false, )); } /** * Add the post type menu to our admin menu */ public function addAutoInsertMenu() { if (!Utilities::settingIsEnabled('auto_insert_blocks')) { return; } add_submenu_page( 'advgb_main', __('Auto Insert Blocks', 'advanced-gutenberg'), __('Auto Insert Blocks', 'advanced-gutenberg'), 'manage_options', 'edit.php?post_type=advgb_insert_block' ); } /** * Modify post type menu parent */ public function setAutoInsertMenuParent($parent_file) { global $current_screen; if ($current_screen && isset($current_screen->post_type) && $current_screen->post_type === 'advgb_insert_block') { return 'advgb_main'; } return $parent_file; } /** * Highlight correct menu item */ public function setAutoInsertSubmenuFile($submenu_file) { global $current_screen; if ($current_screen && isset($current_screen->post_type) && $current_screen->post_type === 'advgb_insert_block') { return 'edit.php?post_type=advgb_insert_block'; } return $submenu_file; } /** * Add custom columns to auto insert blocks list */ public function addAutoInsertColumns($columns) { $new_columns = []; $new_columns['cb'] = $columns['cb']; $new_columns['title'] = $columns['title']; $new_columns['block'] = __('Reusable Block', 'advanced-gutenberg'); $new_columns['position'] = __('Position', 'advanced-gutenberg'); $new_columns['targeting'] = __('Targeting', 'advanced-gutenberg'); $new_columns['date'] = $columns['date']; return $new_columns; } /** * Populate custom columns content */ public function populateAutoInsertColumns($column, $post_id) { switch ($column) { case 'block': $block_id = get_post_meta($post_id, '_advgb_block_id', true); if ($block_id) { $block = get_post($block_id); echo $block ? esc_html($block->post_title) : __('Block not found', 'advanced-gutenberg'); } else { echo '—'; } break; case 'position': $position = get_post_meta($post_id, '_advgb_position', true); $blocks = get_post_meta($post_id, '_advgb_blocks', true); $position_value = get_post_meta($post_id, '_advgb_position_value', true); if ($position) { $position_label = ucfirst(str_replace('_', ' ', $position)); if ($position == 'after_specific_block' && !empty($blocks)) { $position_label .= ' ' . implode(', ', array_values($blocks)) . ''; } if ($position_value && in_array($position, array('after_heading', 'after_paragraph', 'after_block', 'after_specific_block'))) { $position_label .= ' (' . $position_value . ')'; } // phpcs:ignore -- WordPress.Security.EscapeOutput.OutputNotEscaped echo $position_label; } else { echo '—'; } break; case 'targeting': $post_types = get_post_meta($post_id, '_advgb_post_types', true); $taxonomies = get_post_meta($post_id, '_advgb_taxonomies', true); $authors = get_post_meta($post_id, '_advgb_authors', true); $post_ids = get_post_meta($post_id, '_advgb_post_ids', true); $exclude_post_ids = get_post_meta($post_id, '_advgb_exclude_post_ids', true); $post_months = get_post_meta($post_id, '_advgb_post_months', true); $post_years = get_post_meta($post_id, '_advgb_post_years', true); $targeting_info = []; if (!empty($post_types)) { $post_type_labels = []; foreach ($post_types as $post_type) { $post_type_obj = get_post_type_object($post_type); if ($post_type_obj) { $post_type_labels[] = sprintf( '%s', esc_url(admin_url('edit.php?post_type=' . $post_type)), esc_html($post_type_obj->labels->name) ); } } $targeting_info[] = sprintf( __('Post Types: %s', 'advanced-gutenberg'), implode(', ', $post_type_labels) ); } if (!empty($authors)) { $author_links = []; foreach ($authors as $author_id) { $author = get_user_by('ID', $author_id); if ($author) { $author_links[] = sprintf( '%s', esc_url(admin_url('user-edit.php?user_id=' . $author_id)), esc_html($author->display_name) ); } } $targeting_info[] = sprintf( __('Authors: %s', 'advanced-gutenberg'), implode(', ', $author_links) ); } if (!empty($taxonomies)) { $taxonomy_groups = []; foreach ($taxonomies as $taxonomy => $term_ids) { $taxonomy_obj = get_taxonomy($taxonomy); if (!$taxonomy_obj) { continue; } $term_links = []; foreach ($term_ids as $term_id) { $term = get_term($term_id, $taxonomy); if ($term && !is_wp_error($term)) { $term_links[] = sprintf( '%s', esc_url(admin_url('term.php?taxonomy=' . $taxonomy . '&tag_ID=' . $term_id)), esc_html($term->name) ); } } if (!empty($term_links)) { $taxonomy_groups[] = sprintf( '%s: %s', esc_html($taxonomy_obj->labels->name), implode(', ', $term_links) ); } } if (!empty($taxonomy_groups)) { $targeting_info[] = implode('
', $taxonomy_groups); } } if (!empty($post_months)) { $months = [ 1 => __('January', 'advanced-gutenberg'), 2 => __('February', 'advanced-gutenberg'), 3 => __('March', 'advanced-gutenberg'), 4 => __('April', 'advanced-gutenberg'), 5 => __('May', 'advanced-gutenberg'), 6 => __('June', 'advanced-gutenberg'), 7 => __('July', 'advanced-gutenberg'), 8 => __('August', 'advanced-gutenberg'), 9 => __('September', 'advanced-gutenberg'), 10 => __('October', 'advanced-gutenberg'), 11 => __('November', 'advanced-gutenberg'), 12 => __('December', 'advanced-gutenberg') ]; $months_name = []; foreach ($post_months as $post_month): $months_name[] = $months[$post_month]; endforeach; $targeting_info[] = sprintf( __('Post Created in: %s', 'advanced-gutenberg'), implode(', ', $months_name) ); } if (!empty($post_years)) { $targeting_info[] = sprintf( __('Post Created in: %s', 'advanced-gutenberg'), implode(', ', $post_years) ); } if (!empty($post_ids)) { $post_links = []; foreach ($post_ids as $post_id): $post_links[] = sprintf( '%s', esc_url(admin_url('post.php?post=' . $post_id . '&action=edit')), esc_html($post_id) ); endforeach; $targeting_info[] = sprintf( __('Specific Post IDs: %s', 'advanced-gutenberg'), implode(', ', $post_links) ); } if (!empty($exclude_post_ids)) { $exclude_post_links = []; foreach ($exclude_post_ids as $exclude_post_id): $exclude_post_links[] = sprintf( '%s', esc_url(admin_url('post.php?post=' . $exclude_post_id . '&action=edit')), esc_html($exclude_post_id) ); endforeach; $targeting_info[] = sprintf( __('Exclude Post IDs: %s', 'advanced-gutenberg'), implode(', ', $exclude_post_links) ); } echo !empty($targeting_info) ? implode('
', $targeting_info) : __('None', 'advanced-gutenberg'); break; } } /** * Auto insert blocks into content */ public function autoInsertBlocks($content) { global $post; if (!Utilities::settingIsEnabled('auto_insert_blocks')) { return $content; } if (!$post || !is_singular()) { return $content; } if (post_password_required($post)) { return $content; } $rules = $this->getActiveInsertionRules($post); if (empty($rules)) { return $content; } // Remove our filter temporarily remove_filter('the_content', [$this, 'autoInsertBlocks'], -10); $raw_content = $post->post_content; // Parse and apply insertions $blocks = parse_blocks($raw_content); foreach ($rules as $rule) { $blocks = $this->insertBlockByRule($blocks, $rule); } // Convert back to block markup $content_with_insertions = serialize_blocks($blocks); // Readd our filter add_filter('the_content', [$this, 'autoInsertBlocks'], -10); return $content_with_insertions; } /** * Get active insertion rules for a post */ private function getActiveInsertionRules($post) { $rules = get_posts(array( 'post_type' => 'advgb_insert_block', 'post_status' => 'publish', 'numberposts' => -1 )); $active_rules = []; foreach ($rules as $rule) { if ($this->shouldApplyRule($rule, $post)) { $active_rules[] = array( 'id' => $rule->ID, 'block_id' => get_post_meta($rule->ID, '_advgb_block_id', true), 'position' => get_post_meta($rule->ID, '_advgb_position', true), 'allowed_blocks' => get_post_meta($rule->ID, '_advgb_blocks', true), 'excluded_blocks' => get_post_meta($rule->ID, '_advgb_excluded_blocks', true), 'position_value' => get_post_meta($rule->ID, '_advgb_position_value', true), 'priority' => get_post_meta($rule->ID, '_advgb_priority', true) ); } } // Sort by priority usort($active_rules, function ($a, $b) { return intval($a['priority']) - intval($b['priority']); }); return $active_rules; } /** * Check if rule should apply to current post */ private function shouldApplyRule($rule, $post) { // Check specific post IDs first $post_ids = get_post_meta($rule->ID, '_advgb_post_ids', true); if (!empty($post_ids)) { return in_array($post->ID, $post_ids); } // Check excluded post IDs $exclude_post_ids = get_post_meta($rule->ID, '_advgb_exclude_post_ids', true); if (!empty($exclude_post_ids) && in_array($post->ID, $exclude_post_ids)) { return false; } // Check post types $allowed_post_types = get_post_meta($rule->ID, '_advgb_post_types', true); if (empty($allowed_post_types) || !empty($allowed_post_types) && !in_array($post->post_type, $allowed_post_types)) { return false; } // Check taxonomies $allowed_taxonomies = get_post_meta($rule->ID, '_advgb_taxonomies', true); if (!empty($allowed_taxonomies)) { $post_matches_taxonomy = false; foreach ($allowed_taxonomies as $taxonomy => $term_ids) { if (!empty($term_ids)) { $post_terms = wp_get_object_terms($post->ID, $taxonomy, array('fields' => 'ids')); if (!empty(array_intersect($term_ids, $post_terms))) { $post_matches_taxonomy = true; break; } } } if (!$post_matches_taxonomy) { return false; } } // Check authors $allowed_authors = get_post_meta($rule->ID, '_advgb_authors', true); if (!empty($allowed_authors) && !in_array($post->post_author, $allowed_authors)) { return false; } // Check post creation months $allowed_months = get_post_meta($rule->ID, '_advgb_post_months', true); if (!empty($allowed_months)) { $post_month = intval(get_the_date('n', $post->ID)); if (!in_array($post_month, $allowed_months)) { return false; } } // Check post creation years $allowed_years = get_post_meta($rule->ID, '_advgb_post_years', true); if (!empty($allowed_years)) { $post_year = intval(get_the_date('Y', $post->ID)); if (!in_array($post_year, $allowed_years)) { return false; } } return true; } /** * Insert block according to rule */ public function insertBlockByRule($blocks, $rule) { // Load reusable block to insert $block_content = get_post($rule['block_id']); if (!$block_content) { return $blocks; } // Render the entire reusable block once $rendered_content = $this->renderReusableBlockLikeWordPressCore($block_content); $html_block = [ 'blockName' => 'core/html', 'attrs' => [], 'innerBlocks' => [], 'innerHTML' => $rendered_content, 'innerContent' => [$rendered_content], ]; $insert_blocks = [$html_block]; switch ($rule['position']) { case 'beginning': $blocks = array_merge($insert_blocks, $blocks); break; case 'end': $blocks = array_merge($blocks, $insert_blocks); break; default: /** * Allow developers to hook into custom insertion logic. * * @param array $blocks The current list of blocks in the post. * @param array $insert_blocks The blocks we want to insert. * @param array $rule The insertion rule. */ $blocks = apply_filters('advgb_insert_block_by_rule_default', $blocks, $insert_blocks, $rule); break; } return $blocks; } /** * Render reusable block using the same method WordPress core uses */ private function renderReusableBlockLikeWordPressCore($reusable_block) { global $wp_embed; if (!$reusable_block || 'wp_block' !== $reusable_block->post_type) { return ''; } if ('publish' !== $reusable_block->post_status || !empty($reusable_block->post_password)) { return ''; } // Handle embeds for reusable blocks $content = $wp_embed->run_shortcode($reusable_block->post_content); $content = $wp_embed->autoembed($content); // Apply Block Hooks if the function exists if (function_exists('apply_block_hooks_to_content_from_post_object')) { $content = apply_block_hooks_to_content_from_post_object($content, $reusable_block); } // Process blocks $content = do_blocks($content); return $content; } /** * Save auto insert rule meta data */ public function saveAutoInsertRule($post_id) { if (!Utilities::settingIsEnabled('auto_insert_blocks')) { return; } // Check if this is an auto insert rule if (get_post_type($post_id) !== 'advgb_insert_block') { return; } // Check nonce if (!isset($_POST['advgb_auto_insert_nonce']) || !wp_verify_nonce($_POST['advgb_auto_insert_nonce'], 'advgb_auto_insert_meta')) { return; } // Check permissions if (!current_user_can('edit_post', $post_id)) { return; } // Save block selection if (isset($_POST['advgb_block_id'])) { update_post_meta($post_id, '_advgb_block_id', intval($_POST['advgb_block_id'])); } // Save position settings $position = isset($_POST['advgb_position']) ? sanitize_text_field($_POST['advgb_position']) : 'beginning'; if (!$this->proActive && !in_array($position, ['beginning', 'end'])) { $position = 'beginning'; } update_post_meta($post_id, '_advgb_position', $position); // Save targeting options $post_types = isset($_POST['advgb_post_types']) ? array_map('sanitize_text_field', $_POST['advgb_post_types']) : ['post']; if (!$this->proActive) { $post_types = ['post']; } update_post_meta($post_id, '_advgb_post_types', $post_types); $taxonomies = isset($_POST['advgb_taxonomies']) ? $_POST['advgb_taxonomies'] : []; $sanitized_taxonomies = []; foreach ($taxonomies as $taxonomy => $terms) { if (!$this->proActive && !in_array($taxonomy, ['category', 'post_tag'])) { continue; } $sanitized_taxonomies[sanitize_text_field($taxonomy)] = array_map('intval', $terms); } update_post_meta($post_id, '_advgb_taxonomies', $sanitized_taxonomies); // Save rule settings if (isset($_POST['advgb_priority'])) { update_post_meta($post_id, '_advgb_priority', intval($_POST['advgb_priority'])); } do_action('advgb_insert_block_by_rule_updated', $post_id, $_POST); } /** * AJAX endpoint for searching taxonomy terms */ public function searchTaxonomyTerms() { check_ajax_referer('advgb_auto_insert_nonce', 'nonce'); if (!current_user_can('administrator')) { wp_die('Unauthorized'); } $taxonomy = isset($_GET['taxonomy']) ? sanitize_text_field($_GET['taxonomy']) : 'category'; $search = isset($_GET['search']) ? sanitize_text_field($_GET['search']) : ''; $args = [ 'taxonomy' => $taxonomy, 'hide_empty' => false, 'number' => 20 ]; if (!empty($search)) { $args['search'] = $search; } $terms = get_terms($args); $results = []; foreach ($terms as $term) { $results[] = [ 'id' => $term->term_id, 'text' => $term->name ]; } wp_send_json_success($results); } /** * AJAX endpoint for searching users */ public function searchUsers() { check_ajax_referer('advgb_auto_insert_nonce', 'nonce'); if (!current_user_can('administrator')) { wp_die('Unauthorized'); } $search = isset($_GET['search']) ? sanitize_text_field($_GET['search']) : ''; $args = [ 'search_columns' => ['user_login', 'user_nicename', 'user_email', 'display_name'], 'number' => 20 ]; if (!empty($search)) { $args['search'] = '*' . $search . '*'; } $users = get_users($args); $results = []; foreach ($users as $user) { $results[] = [ 'id' => $user->ID, 'text' => $user->display_name . ' (' . $user->user_login . ')' ]; } wp_send_json_success($results); } /** * AJAX endpoint for searching blocks */ public function searchBlocks() { check_ajax_referer('advgb_auto_insert_nonce', 'nonce'); if (!current_user_can('administrator')) { wp_die('Unauthorized'); } $search = isset($_GET['search']) ? sanitize_text_field($_GET['search']) : ''; $advgb_blocks_list = get_option('advgb_blocks_list'); $results = []; if ($advgb_blocks_list && is_array($advgb_blocks_list)) { foreach ($advgb_blocks_list as $index => $block_details) { $block_title = !empty($block_details['title']) ? $block_details['title'] : $block_details['name']; if (empty($search) || stripos($block_title, $search) !== false) { $results[] = [ 'id' => $block_details['name'], 'text' => $block_title, ]; } } } wp_send_json_success($results); } /** * AJAX endpoint for searching posts */ public function searchPosts() { check_ajax_referer('advgb_auto_insert_nonce', 'nonce'); if (!current_user_can('administrator')) { wp_die('Unauthorized'); } $search = isset($_GET['search']) ? sanitize_text_field($_GET['search']) : ''; $post_types = isset($_GET['post_types']) ? array_map('sanitize_text_field', $_GET['post_types']) : ['post']; $args = [ 'post_type' => $post_types, 'post_status' => 'publish', 'posts_per_page' => 20, 's' => $search ]; $posts = get_posts($args); $results = []; foreach ($posts as $post) { $post_type_obj = get_post_type_object($post->post_type); $post_type_label = $post_type_obj ? $post_type_obj->labels->singular_name : $post->post_type; $results[] = [ 'id' => $post->ID, 'text' => $post->post_title . ' (' . $post_type_label . ' #' . $post->ID . ')' ]; } wp_send_json_success($results); } /** * Remove quick edit option. */ public function remove_quick_edit_row() { $post_type = (!empty($_GET['post_type'])) ? sanitize_text_field($_GET['post_type']) : ''; if ($post_type == 'advgb_insert_block'): ?> post_type === 'advgb_insert_block') { $duplicate_url = wp_nonce_url( add_query_arg([ 'action' => 'duplicate_auto_insert_block', 'post_id' => $post->ID ], admin_url('admin-post.php')), 'duplicate_auto_insert_block_' . $post->ID ); $actions['duplicate'] = sprintf( '%s', esc_url($duplicate_url), esc_attr__('Duplicate this auto insert rule', 'advanced-gutenberg'), __('Duplicate', 'advanced-gutenberg') ); } return $actions; } /** * Handle duplicate action */ public function handleDuplicateAction() { if (!isset($_GET['action']) || $_GET['action'] !== 'duplicate_auto_insert_block') { return; } if (!isset($_GET['post_id']) || !isset($_GET['_wpnonce'])) { $this->addAdminNotice(__('Invalid request', 'advanced-gutenberg'), 'error'); wp_safe_redirect(admin_url('edit.php?post_type=advgb_insert_block')); exit; } $post_id = intval($_GET['post_id']); $nonce = $_GET['_wpnonce']; if (!wp_verify_nonce($nonce, 'duplicate_auto_insert_block_' . $post_id)) { $this->addAdminNotice(__('Security check failed', 'advanced-gutenberg'), 'error'); wp_safe_redirect(admin_url('edit.php?post_type=advgb_insert_block')); exit; } if (!current_user_can('edit_post', $post_id)) { $this->addAdminNotice(__('You do not have permission to duplicate this item', 'advanced-gutenberg'), 'error'); wp_safe_redirect(admin_url('edit.php?post_type=advgb_insert_block')); exit; } $new_post_id = $this->duplicateAutoInsertBlock($post_id); if ($new_post_id) { $this->addAdminNotice( sprintf( __('Auto insert block duplicated successfully. Edit the new rule', 'advanced-gutenberg'), admin_url('post.php?post=' . $new_post_id . '&action=edit') ), 'success' ); } else { $this->addAdminNotice(__('Error duplicating auto insert block', 'advanced-gutenberg'), 'error'); } wp_safe_redirect(admin_url('edit.php?post_type=advgb_insert_block')); exit; } /** * Remove the month filter dropdown */ public function removeMonthFilters($months, $post_type) { if ($post_type === 'advgb_insert_block') { // Return empty to remove the dropdown return []; } return $months; } /** * Duplicate auto insert block with all meta data */ private function duplicateAutoInsertBlock($post_id) { $post = get_post($post_id); if (!$post || $post->post_type !== 'advgb_insert_block') { return false; } // Create new post $new_post = [ 'post_title' => $post->post_title . ' (' . __('Copy', 'advanced-gutenberg') . ')', 'post_content' => $post->post_content, 'post_status' => 'draft', 'post_type' => 'advgb_insert_block', 'post_author' => get_current_user_id(), ]; $new_post_id = wp_insert_post($new_post); if (is_wp_error($new_post_id)) { return false; } // Get all post meta $meta_keys = get_post_custom_keys($post_id); if (!empty($meta_keys)) { foreach ($meta_keys as $meta_key) { // Skip internal meta keys if ($meta_key === '_edit_lock' || $meta_key === '_edit_last') { continue; } $meta_values = get_post_custom_values($meta_key, $post_id); foreach ($meta_values as $meta_value) { $meta_value = maybe_unserialize($meta_value); add_post_meta($new_post_id, $meta_key, $meta_value); } } } return $new_post_id; } /** * Add admin notice */ private function addAdminNotice($message, $type = 'info') { $notices = get_transient('advgb_auto_insert_notices'); if (!is_array($notices)) { $notices = []; } $notices[] = [ 'message' => $message, 'type' => $type ]; set_transient('advgb_auto_insert_notices', $notices, 30); } /** * Display admin notices */ public function displayAdminNotices() { $notices = get_transient('advgb_auto_insert_notices'); if (!empty($notices)) { foreach ($notices as $notice) { printf( '

%s

', esc_attr($notice['type']), $notice['message'] ); } delete_transient('advgb_auto_insert_notices'); } } }