function insertPages_handleShortcode_insert($atts, $content = null) { global $wp_query, $post, $wp_current_filter; extract(shortcode_atts(array('page' => '0', 'display' => 'all', 'class' => '', 'inline' => false), $atts)); // Get options set in WordPress dashboard (Settings > Insert Pages). $options = get_option('wpip_settings'); if ($options === FALSE) { $options = wpip_set_defaults(); } // Validation checks. if ($page === '0') { return $content; } // Trying to embed same page in itself. if ($page == $post->ID || $page == $post->post_name) { return $content; } $should_apply_nesting_check = true; /** * Filter the flag indicating whether to apply deep nesting check * that can prevent circular loops. Note that some use cases rely * on inserting pages that themselves have inserted pages, so this * check should be disabled for those individuals. * * @param bool $apply_the_content_filter Indicates whether to apply the_content filter. */ $should_apply_nesting_check = apply_filters('insert_pages_apply_nesting_check', $should_apply_nesting_check); // Don't allow inserted pages to be added to the_content more than once (prevent infinite loops). if ($should_apply_nesting_check) { $done = false; foreach ($wp_current_filter as $filter) { if ('the_content' == $filter) { if ($done) { return $content; } else { $done = true; } } } } // Convert slugs to page IDs to standardize query_posts() lookup below. if (!is_numeric($page)) { $page_object = get_page_by_path($page, OBJECT, get_post_types()); $page = $page_object ? $page_object->ID : $page; } if (is_numeric($page)) { $args = array('p' => intval($page), 'post_type' => get_post_types()); } else { $args = array('name' => esc_attr($page), 'post_type' => get_post_types()); } query_posts($args); $should_apply_the_content_filter = true; /** * Filter the flag indicating whether to apply the_content filter to post * contents and excerpts that are being inserted. * * @param bool $apply_the_content_filter Indicates whether to apply the_content filter. */ $should_apply_the_content_filter = apply_filters('insert_pages_apply_the_content_filter', $should_apply_the_content_filter); $should_use_inline_wrapper = $inline !== false && $inline !== 'false' || array_search('inline', $atts) === 0 || array_key_exists('wpip_wrapper', $options) && $options['wpip_wrapper'] === 'inline'; /** * Filter the flag indicating whether to wrap the inserted content in inline tags (span). * * @param bool $use_inline_wrapper Indicates whether to wrap the content in span tags. */ $should_use_inline_wrapper = apply_filters('insert_pages_use_inline_wrapper', $should_use_inline_wrapper); // Disable the_content filter if using inline tags, since wpautop // inserts p tags and we can't have any inside inline elements. if ($should_use_inline_wrapper) { $should_apply_the_content_filter = false; } // Start our new Loop (only iterate once). if (have_posts()) { ob_start(); // Start output buffering so we can save the output to string // If Beaver Builder plugin is enabled, load any cached styles associated with the inserted page. // Note: Temporarily set the global $post->ID to the inserted page ID, // since Beaver Builder relies on it to load the appropraite styles. if (class_exists('FLBuilder')) { $old_post_id = $post->ID; $post->ID = $page; FLBuilder::enqueue_layout_styles_scripts($page); $post->ID = $old_post_id; } // Show either the title, link, content, everything, or everything via a custom template // Note: if the sharing_display filter exists, it means Jetpack is installed and Sharing is enabled; // This plugin conflicts with Sharing, because Sharing assumes the_content and the_excerpt filters // are only getting called once. The fix here is to disable processing of filters on the_content in // the inserted page. @see https://codex.wordpress.org/Function_Reference/the_content#Alternative_Usage switch ($display) { case "title": the_post(); $title_tag = $should_use_inline_wrapper ? 'span' : 'h1'; echo "<{$title_tag} class='insert-page-title'>"; the_title(); echo "</{$title_tag}>"; break; case "link": the_post(); ?> <a href="<?php the_permalink(); ?> "><?php the_title(); ?> </a><?php break; case "excerpt": the_post(); ?> <h1><a href="<?php the_permalink(); ?> "><?php the_title(); ?> </a></h1><?php if ($should_apply_the_content_filter) { the_excerpt(); } else { echo get_the_excerpt(); } break; case "excerpt-only": the_post(); if ($should_apply_the_content_filter) { the_excerpt(); } else { echo get_the_excerpt(); } break; case "content": the_post(); if ($should_apply_the_content_filter) { the_content(); } else { echo get_the_content(); } break; case "all": the_post(); $title_tag = $should_use_inline_wrapper ? 'span' : 'h1'; echo "<{$title_tag} class='insert-page-title'>"; the_title(); echo "</{$title_tag}>"; if ($should_apply_the_content_filter) { the_content(); } else { echo get_the_content(); } the_meta(); break; default: // display is either invalid, or contains a template file to use $template = locate_template($display); if (strlen($template) > 0) { include $template; // execute the template code } else { // Couldn't find template, so fall back to printing a link to the page. the_post(); ?> <a href="<?php the_permalink(); ?> "><?php the_title(); ?> </a><?php } break; } $content = ob_get_contents(); // Save off output buffer ob_end_clean(); // End output buffering } else { /** * Filter the html that should be displayed if an inserted page was not found. * * @param string $content html to be displayed. Defaults to an empty string. */ $content = apply_filters('insert_pages_not_found_message', $content); } wp_reset_query(); $wrapper_tag = $should_use_inline_wrapper ? 'span' : 'div'; $content = "<{$wrapper_tag} data-post-id='{$page}' class='insert-page insert-page-{$page} {$class}'>{$content}</{$wrapper_tag}>"; return $content; //return do_shortcode($content); // careful: watch for infinite loops with nested inserts }
function insertPages_handleShortcode_insert($atts, $content = null) { global $wp_query, $post, $wp_current_filter; // Shortcode attributes. $attributes = shortcode_atts(array('page' => '0', 'display' => 'all', 'class' => '', 'inline' => false), $atts); // Validation checks. if ($attributes['page'] === '0') { return $content; } // Trying to embed same page in itself. if (!is_null($post) && property_exists($post, 'ID') && ($attributes['page'] == $post->ID || $attributes['page'] == $post->post_name)) { return $content; } // Get options set in WordPress dashboard (Settings > Insert Pages). $options = get_option('wpip_settings'); if ($options === FALSE || !is_array($options) || !array_key_exists('wpip_format', $options) || !array_key_exists('wpip_wrapper', $options) || !array_key_exists('wpip_insert_method', $options)) { $options = wpip_set_defaults(); } $attributes['inline'] = $attributes['inline'] !== false && $attributes['inline'] !== 'false' || array_search('inline', $atts) === 0 || array_key_exists('wpip_wrapper', $options) && $options['wpip_wrapper'] === 'inline'; /** * Filter the flag indicating whether to wrap the inserted content in inline tags (span). * * @param bool $use_inline_wrapper Indicates whether to wrap the content in span tags. */ $attributes['inline'] = apply_filters('insert_pages_use_inline_wrapper', $attributes['inline']); $attributes['wrapper_tag'] = $attributes['inline'] ? 'span' : 'div'; $attributes['should_apply_the_content_filter'] = true; /** * Filter the flag indicating whether to apply the_content filter to post * contents and excerpts that are being inserted. * * @param bool $apply_the_content_filter Indicates whether to apply the_content filter. */ $attributes['should_apply_the_content_filter'] = apply_filters('insert_pages_apply_the_content_filter', $attributes['should_apply_the_content_filter']); // Disable the_content filter if using inline tags, since wpautop // inserts p tags and we can't have any inside inline elements. if ($attributes['inline']) { $attributes['should_apply_the_content_filter'] = false; } $attributes['should_apply_nesting_check'] = true; /** * Filter the flag indicating whether to apply deep nesting check * that can prevent circular loops. Note that some use cases rely * on inserting pages that themselves have inserted pages, so this * check should be disabled for those individuals. * * @param bool $apply_the_content_filter Indicates whether to apply the_content filter. */ $attributes['should_apply_nesting_check'] = apply_filters('insert_pages_apply_nesting_check', $attributes['should_apply_nesting_check']); // Don't allow inserted pages to be added to the_content more than once (prevent infinite loops). if ($attributes['should_apply_nesting_check']) { $done = false; foreach ($wp_current_filter as $filter) { if ('the_content' == $filter) { if ($done) { return $content; } else { $done = true; } } } } // Get the WP_Post object from the provided slug or ID. if (!is_numeric($attributes['page'])) { // Get list of post types that can be inserted (page, post, custom // types), excluding builtin types (nav_menu_item, attachment). $insertable_post_types = array_filter(get_post_types(), create_function('$type', 'return ! in_array( $type, array( "nav_menu_item", "attachment" ) );')); $inserted_page = get_page_by_path($attributes['page'], OBJECT, $insertable_post_types); $attributes['page'] = $inserted_page ? $inserted_page->ID : $attributes['page']; } else { $inserted_page = get_post(intval($attributes['page'])); } // Use "Normal" insert method (get_post()). if ($options['wpip_insert_method'] !== 'legacy') { // If we couldn't retrieve the page, fire the filter hook showing a not-found message. if ($inserted_page === null) { /** * Filter the html that should be displayed if an inserted page was not found. * * @param string $content html to be displayed. Defaults to an empty string. */ $content = apply_filters('insert_pages_not_found_message', $content); // Short-circuit since we didn't find the page. return $content; } // Start output buffering so we can save the output to a string. ob_start(); // If Beaver Builder plugin is enabled, load any cached styles associated with the inserted page. // Note: Temporarily set the global $post->ID to the inserted page ID, // since Beaver Builder relies on it to load the appropriate styles. if (class_exists('FLBuilder')) { // If we're not in The Loop (i.e., global $post isn't assigned), // temporarily populate it with the post to be inserted so we can // retrieve Beaver Builder styles for that post. Reset $post to null // after we're done. if (is_null($post)) { $old_post_id = null; $post = $inserted_page; } else { $old_post_id = $post->ID; $post->ID = $inserted_page->ID; } FLBuilder::enqueue_layout_styles_scripts($inserted_page->ID); if (is_null($old_post_id)) { $post = null; } else { $post->ID = $old_post_id; } } // Show either the title, link, content, everything, or everything via a custom template // Note: if the sharing_display filter exists, it means Jetpack is installed and Sharing is enabled; // This plugin conflicts with Sharing, because Sharing assumes the_content and the_excerpt filters // are only getting called once. The fix here is to disable processing of filters on the_content in // the inserted page. @see https://codex.wordpress.org/Function_Reference/the_content#Alternative_Usage switch ($attributes['display']) { case "title": $title_tag = $attributes['inline'] ? 'span' : 'h1'; echo "<{$title_tag} class='insert-page-title'>"; echo get_the_title($inserted_page->ID); echo "</{$title_tag}>"; break; case "link": ?> <a href="<?php echo esc_url(get_permalink($inserted_page->ID)); ?> "><?php echo get_the_title($inserted_page->ID); ?> </a><?php break; case "excerpt": ?> <h1><a href="<?php echo esc_url(get_permalink($inserted_page->ID)); ?> "><?php echo get_the_title($inserted_page->ID); ?> </a></h1><?php echo $this->insertPages_trim_excerpt(get_post_field('post_excerpt', $inserted_page->ID), $inserted_page->ID, $attributes['should_apply_the_content_filter']); break; case "excerpt-only": echo $this->insertPages_trim_excerpt(get_post_field('post_excerpt', $inserted_page->ID), $inserted_page->ID, $attributes['should_apply_the_content_filter']); break; case "content": $content = get_post_field('post_content', $inserted_page->ID); if ($attributes['should_apply_the_content_filter']) { $content = apply_filters('the_content', $content); } echo $content; break; case "all": // Title. $title_tag = $attributes['inline'] ? 'span' : 'h1'; echo "<{$title_tag} class='insert-page-title'>"; echo get_the_title($inserted_page->ID); echo "</{$title_tag}>"; // Content. $content = get_post_field('post_content', $inserted_page->ID); if ($attributes['should_apply_the_content_filter']) { $content = apply_filters('the_content', $content); } echo $content; // Meta. // @ref https://core.trac.wordpress.org/browser/tags/4.4/src/wp-includes/post-template.php#L968 if ($keys = get_post_custom_keys($inserted_page->ID)) { echo "<ul class='post-meta'>\n"; foreach ((array) $keys as $key) { $keyt = trim($key); if (is_protected_meta($keyt, 'post')) { continue; } $values = array_map('trim', get_post_custom_values($key)); $value = implode($values, ', '); /** * Filter the HTML output of the li element in the post custom fields list. * * @since 2.2.0 * * @param string $html The HTML output for the li element. * @param string $key Meta key. * @param string $value Meta value. */ echo apply_filters('the_meta_key', "<li><span class='post-meta-key'>{$key}:</span> {$value}</li>\n", $key, $value); } echo "</ul>\n"; } break; default: // display is either invalid, or contains a template file to use // Legacy/compatibility code: In order to use custom templates, // we use query_posts() to provide the template with the global // state it requires for the inserted page (in other words, all // template tags will work with respect to the inserted page // instead of the parent page / main loop). Note that this may // cause some compatibility issues with other plugins. // @ref https://codex.wordpress.org/Function_Reference/query_posts if (is_numeric($attributes['page'])) { $args = array('p' => intval($attributes['page']), 'post_type' => get_post_types()); } else { $args = array('name' => esc_attr($attributes['page']), 'post_type' => get_post_types()); } $inserted_page = query_posts($args); if (have_posts()) { $template = locate_template($attributes['display']); if (strlen($template) > 0) { include $template; // execute the template code } else { // Couldn't find template, so fall back to printing a link to the page. the_post(); ?> <a href="<?php the_permalink(); ?> "><?php the_title(); ?> </a><?php } } wp_reset_query(); } // Save output buffer contents. $content = ob_get_clean(); // Use "Legacy" insert method (query_posts()). } else { // Construct query_posts arguments. if (is_numeric($attributes['page'])) { $args = array('p' => intval($attributes['page']), 'post_type' => get_post_types()); } else { $args = array('name' => esc_attr($attributes['page']), 'post_type' => get_post_types()); } $posts = query_posts($args); if (have_posts()) { // Start output buffering so we can save the output to string ob_start(); // If Beaver Builder plugin is enabled, load any cached styles associated with the inserted page. // Note: Temporarily set the global $post->ID to the inserted page ID, // since Beaver Builder relies on it to load the appropriate styles. if (class_exists('FLBuilder')) { // If we're not in The Loop (i.e., global $post isn't assigned), // temporarily populate it with the post to be inserted so we can // retrieve Beaver Builder styles for that post. Reset $post to null // after we're done. if (is_null($post)) { $old_post_id = null; $post = $inserted_page; } else { $old_post_id = $post->ID; $post->ID = $inserted_page->ID; } FLBuilder::enqueue_layout_styles_scripts($inserted_page->ID); if (is_null($old_post_id)) { $post = null; } else { $post->ID = $old_post_id; } } // Show either the title, link, content, everything, or everything via a custom template // Note: if the sharing_display filter exists, it means Jetpack is installed and Sharing is enabled; // This plugin conflicts with Sharing, because Sharing assumes the_content and the_excerpt filters // are only getting called once. The fix here is to disable processing of filters on the_content in // the inserted page. @see https://codex.wordpress.org/Function_Reference/the_content#Alternative_Usage switch ($attributes['display']) { case "title": the_post(); $title_tag = $attributes['inline'] ? 'span' : 'h1'; echo "<{$title_tag} class='insert-page-title'>"; the_title(); echo "</{$title_tag}>"; break; case "link": the_post(); ?> <a href="<?php the_permalink(); ?> "><?php the_title(); ?> </a><?php break; case "excerpt": the_post(); ?> <h1><a href="<?php the_permalink(); ?> "><?php the_title(); ?> </a></h1><?php if ($attributes['should_apply_the_content_filter']) { the_excerpt(); } else { echo get_the_excerpt(); } break; case "excerpt-only": the_post(); if ($attributes['should_apply_the_content_filter']) { the_excerpt(); } else { echo get_the_excerpt(); } break; case "content": the_post(); if ($attributes['should_apply_the_content_filter']) { the_content(); } else { echo get_the_content(); } break; case "all": the_post(); $title_tag = $attributes['inline'] ? 'span' : 'h1'; echo "<{$title_tag} class='insert-page-title'>"; the_title(); echo "</{$title_tag}>"; if ($attributes['should_apply_the_content_filter']) { the_content(); } else { echo get_the_content(); } the_meta(); break; default: // display is either invalid, or contains a template file to use $template = locate_template($attributes['display']); if (strlen($template) > 0) { include $template; // execute the template code } else { // Couldn't find template, so fall back to printing a link to the page. the_post(); ?> <a href="<?php the_permalink(); ?> "><?php the_title(); ?> </a><?php } break; } // Save output buffer contents. $content = ob_get_clean(); } else { /** * Filter the html that should be displayed if an inserted page was not found. * * @param string $content html to be displayed. Defaults to an empty string. */ $content = apply_filters('insert_pages_not_found_message', $content); } wp_reset_query(); } /** * Filter the markup generated for the inserted page. * * @param string $content The post content of the inserted page. * @param object $inserted_page The post object returned from querying the inserted page. * @param array $attributes Extra parameters modifying the inserted page. * page: Page ID or slug of page to be inserted. * display: Content to display from inserted page. * class: Extra classes to add to inserted page wrapper element. * inline: Boolean indicating wrapper element should be a span. * should_apply_nesting_check: Whether to disable nested inserted pages. * should_apply_the_content_filter: Whether to apply the_content filter to post contents and excerpts. * wrapper_tag: Tag to use for the wrapper element (e.g., div, span). */ $content = apply_filters('insert_pages_wrap_content', $content, $inserted_page, $attributes); return $content; }
public function filterContentTemplateOutput($content, $template_selected, $id, $kind) { if ($template_selected && $template_selected > 0) { // There is a CT applied, either on single/archive pages or on a wpv-post-body shortcode // Render the BB content of the CT, if any, and prevent Beaver from overwriting it $editor_choice = get_post_meta($template_selected, $this->medium->getOptionNameEditorChoice(), true); if ($editor_choice && $editor_choice == $this->editor->getId()) { FLBuilderModel::update_post_data('post_id', $template_selected); $this->beaver_post_id_stack[] = $template_selected; $content = FLBuilder::render_content($content); if (!in_array($template_selected, $this->beaver_post_id_assets_rendered)) { FLBuilder::enqueue_layout_styles_scripts(); $this->beaver_post_id_assets_rendered[] = $template_selected; } array_pop($this->beaver_post_id_stack); if (count($this->beaver_post_id_stack) > 0) { $aux_array = array_slice($this->beaver_post_id_stack, -1); $bb_post_id = array_pop($aux_array); FLBuilderModel::update_post_data('post_id', $bb_post_id); } else { FLBuilderModel::update_post_data('post_id', get_the_ID()); } } remove_filter('the_content', 'FLBuilder::render_content'); $this->beaver_filter_enabled = false; } else { global $post; if (isset($post->view_template_override)) { $this_id = get_the_ID(); // This is coming from a wpv-post-body shortcode with view_template="None" so we do need to apply BB here FLBuilderModel::update_post_data('post_id', $this_id); $this->beaver_post_id_stack[] = $this_id; $content = FLBuilder::render_content($content); if (!in_array($template_selected, $this->beaver_post_id_assets_rendered)) { //FLBuilder::enqueue_layout_styles_scripts(); $this->beaver_post_id_assets_rendered[] = $this_id; } array_pop($this->beaver_post_id_stack); if (count($this->beaver_post_id_stack) > 0) { $aux_array = array_slice($this->beaver_post_id_stack, -1); $bb_post_id = array_pop($aux_array); FLBuilderModel::update_post_data('post_id', $bb_post_id); } } } return $content; }