| @@ -1,33 +1,51 @@ | ||
| 1 | 1 | <?php |
| 2 | - /** @var \WPDeveloper\BetterDocs\Shortcodes\ToC $widget */ | |
| 3 | - $toc_data = $widget->format_toc_data( $post->post_content, $htags, $hierarchy ); | |
| 2 | +// phpcs:disable WordPress.NamingConventions.PrefixAllGlobals.NonPrefixedVariableFound -- view template receives variables via extract(); prefixing is impractical. | |
| 3 | + | |
| 4 | +if ( ! defined( 'ABSPATH' ) ) { | |
| 5 | + exit; | |
| 6 | +} | |
| 7 | +/** @var \WPDeveloper\BetterDocs\Shortcodes\ToC $widget */ | |
| 8 | +if ( $post !== null ) { | |
| 9 | + // Check if post is password protected and user hasn't provided correct password | |
| 10 | + if ( post_password_required( $post->ID ) ) { | |
| 11 | + // Don't show ToC for password-protected posts until password is provided | |
| 12 | + return; | |
| 13 | + } | |
| 4 | 14 | |
| 5 | - if ( empty( $toc_data->items ) ) { | |
| 6 | - return; | |
| 7 | - } | |
| 15 | + // Process content for special characters without triggering heavy content filters | |
| 16 | + // This prevents memory issues from plugins like WPML while still handling special characters | |
| 17 | + $processed_content = $widget->process_content_for_toc( $post->post_content ); | |
| 18 | + $toc_data = $widget->format_toc_data( $processed_content, $htags, $hierarchy ); | |
| 19 | + if ( empty( $toc_data->items ) ) { | |
| 20 | + return; | |
| 21 | + } | |
| 22 | +} else { | |
| 23 | + return; | |
| 24 | +} | |
| 8 | 25 | |
| 9 | - $collapsible_arrow = ''; | |
| 10 | - $wrapper_classes = ['betterdocs-toc']; | |
| 11 | 26 | |
| 12 | - if ( empty( $toc_title ) ) { | |
| 13 | - $toc_title = betterdocs()->settings->get( 'toc_title', __( 'Table of Contents', 'betterdocs' ) ); | |
| 14 | - $toc_title = stripslashes( $toc_title ); | |
| 15 | - } | |
| 27 | + $collapsible_arrow = ''; | |
| 28 | + $wrapper_classes = [ 'betterdocs-toc' ]; | |
| 16 | 29 | |
| 17 | - if ( $collapsible_on_mobile == '1' ) { | |
| 18 | - $wrapper_classes[] = 'collapsible-sm'; | |
| 19 | - $collapsible_arrow = "<svg class='angle-icon angle-up' aria-hidden='true' focusable='false' data-prefix='fas' data-icon='angle-up' class='svg-inline--fa fa-angle-up fa-w-10' role='img' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 512'><path fill='currentColor' d='M177 159.7l136 136c9.4 9.4 9.4 24.6 0 33.9l-22.6 22.6c-9.4 9.4-24.6 9.4-33.9 0L160 255.9l-96.4 96.4c-9.4 9.4-24.6 9.4-33.9 0L7 329.7c-9.4-9.4-9.4-24.6 0-33.9l136-136c9.4-9.5 24.6-9.5 34-.1z'></path></svg><svg class='angle-icon angle-down' aria-hidden='true' focusable='false' data-prefix='fas' data-icon='angle-down' class='svg-inline--fa fa-angle-down fa-w-10' role='img' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 512'><path fill='currentColor' d='M143 352.3L7 216.3c-9.4-9.4-9.4-24.6 0-33.9l22.6-22.6c9.4-9.4 24.6-9.4 33.9 0l96.4 96.4 96.4-96.4c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9l-136 136c-9.2 9.4-24.4 9.4-33.8 0z'></path></svg>"; | |
| 20 | - } | |
| 30 | +if ( empty( $toc_title ) ) { | |
| 31 | + $toc_title = betterdocs()->settings->get( 'toc_title', __( 'Table of Contents', 'betterdocs' ) ); | |
| 32 | + $toc_title = esc_html( stripslashes( $toc_title ) ); | |
| 33 | +} | |
| 21 | 34 | |
| 22 | - if ( $list_number == '1' ) { | |
| 23 | - $wrapper_classes[] = 'toc-list-number'; | |
| 24 | - } | |
| 35 | +if ( $collapsible_on_mobile == '1' ) { | |
| 36 | + $wrapper_classes[] = 'collapsible-sm'; | |
| 37 | + $collapsible_arrow = "<svg class='angle-icon angle-up' aria-hidden='true' focusable='false' data-prefix='fas' data-icon='angle-up' class='svg-inline--fa fa-angle-up fa-w-10' role='img' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 512'><path fill='currentColor' d='M177 159.7l136 136c9.4 9.4 9.4 24.6 0 33.9l-22.6 22.6c-9.4 9.4-24.6 9.4-33.9 0L160 255.9l-96.4 96.4c-9.4 9.4-24.6 9.4-33.9 0L7 329.7c-9.4-9.4-9.4-24.6 0-33.9l136-136c9.4-9.5 24.6-9.5 34-.1z'></path></svg><svg class='angle-icon angle-down' aria-hidden='true' focusable='false' data-prefix='fas' data-icon='angle-down' class='svg-inline--fa fa-angle-down fa-w-10' role='img' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 320 512'><path fill='currentColor' d='M143 352.3L7 216.3c-9.4-9.4-9.4-24.6 0-33.9l22.6-22.6c9.4-9.4 24.6-9.4 33.9 0l96.4 96.4 96.4-96.4c9.4-9.4 24.6-9.4 33.9 0l22.6 22.6c9.4 9.4 9.4 24.6 0 33.9l-136 136c-9.2 9.4-24.4 9.4-33.8 0z'></path></svg>"; | |
| 38 | +} | |
| 39 | + | |
| 40 | +if ( $list_number == '1' ) { | |
| 41 | + $wrapper_classes[] = 'toc-list-number'; | |
| 42 | +} | |
| 25 | 43 | ?> |
| 26 | 44 | |
| 27 | -<div class="<?php esc_attr_e( implode( ' ', $wrapper_classes ), 'betterdocs' );?>"> | |
| 28 | - <span class="toc-title"> | |
| 29 | - <?php echo $toc_title . $collapsible_arrow; ?> | |
| 30 | - </span> | |
| 45 | +<div class="<?php echo esc_attr( implode( ' ', $wrapper_classes ) ); ?>"> | |
| 46 | + <span class="toc-title"> | |
| 47 | + <?php echo $toc_title . $collapsible_arrow; //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Title Is Escaped Above & Svg's Cannot Be Escaped ?> | |
| 48 | + </span> | |
| 31 | 49 | |
| 32 | - <?php echo $toc_data->print( $toc_data->items, $hierarchy, 1 ); ?> | |
| 50 | + <?php echo $toc_data->print( $toc_data->items, $hierarchy, 1 ); //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Already Escaped Above, Svg Is Not Needed For Escaping ?> | |
| 33 | 51 | </div> |