'elementor_library', 'post_status' => 'publish', 'posts_per_page' => 150, 'orderby' => 'title', 'order' => 'ASC', // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.SuppressFilters_suppress_filters -- Global Elementor template list and preview selector deliberately include every language. 'suppress_filters' => true, ]); $choices = []; foreach ((array) $posts as $post) { if (!is_object($post) || empty($post->ID) || !mkb_glossar_shared_template_is_valid($post->ID)) continue; $choices[(int) $post->ID] = get_the_title($post->ID); } return $choices; } /** Dynamic term data always comes from the queried glossary term, never the saved template. */ function mkb_glossar_shared_template_rendering($on = null) { static $rendering = false; if (is_bool($on)) $rendering = $on; return $rendering; } function mkb_glossar_render_shared_template($template_id) { $template_id = absint($template_id); if (!did_action('elementor/loaded') || !class_exists('\\Elementor\\Plugin') || !mkb_glossar_shared_template_is_valid($template_id) || mkb_glossar_shared_template_rendering()) return ''; $plugin = \Elementor\Plugin::instance(); if (!is_object($plugin) || !isset($plugin->frontend) || !method_exists($plugin->frontend, 'get_builder_content_for_display')) return ''; mkb_glossar_shared_template_rendering(true); try { $markup = $plugin->frontend->get_builder_content_for_display($template_id, true); } catch (\Throwable $error) { // A broken/deactivated builder must never break a public glossary page. $markup = ''; } finally { mkb_glossar_shared_template_rendering(false); } return is_string($markup) ? $markup : ''; } /** Published glossary terms offered only inside the Elementor editor. */ function mkb_glossar_elementor_details_preview_terms() { if (!current_user_can('edit_posts')) return ['0' => __('Choose a term for the editor preview', 'mkb-glossar')]; $items = get_posts([ 'post_type' => 'mkb_glossar', 'post_status' => 'publish', 'posts_per_page' => -1, 'fields' => 'ids', 'orderby' => 'title', 'order' => 'ASC', // phpcs:ignore WordPressVIPMinimum.Performance.WPQueryParams.SuppressFilters_suppress_filters -- Global Elementor template list and preview selector deliberately include every language. 'suppress_filters' => true, ]); $options = ['0' => __('Choose a term for the editor preview', 'mkb-glossar')]; foreach ((array)$items as $item) { $id = absint(is_object($item) ? ($item->ID ?? 0) : $item); if (!$id || get_post_type($id) !== 'mkb_glossar' || get_post_status($id) !== 'publish') continue; $title = get_the_title($id); if (!is_string($title) || $title === '') continue; $language = function_exists('mkb_glossar_post_language') ? (string)mkb_glossar_post_language($id) : ''; $options[(string)$id] = $title . ($language !== '' ? ' (' . strtoupper($language) . ')' : ''); } return $options; } /** * Editor previews may show an example; public shared layouts never use that example. * Explicit IDs remain available for standalone widgets on regular Elementor pages. */ function mkb_glossar_elementor_details_context_id($queried, $explicit, $preview, $is_editing, $in_shared_layout) { $queried = absint($queried); $explicit = absint($explicit); $preview = absint($preview); if ($in_shared_layout) { $id = $queried; } elseif ($is_editing && $preview && get_post_type($preview) === 'mkb_glossar' && get_post_status($preview) === 'publish') { $id = $preview; } else { $id = $explicit ?: $queried; } if (!$id || get_post_type($id) !== 'mkb_glossar') return 0; if (get_post_status($id) !== 'publish' && !current_user_can('edit_post', $id)) return 0; return $id; }