PluginProbe
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot / 3.8.9
BetterDocs – AI Documentation, Knowledge Base, MCP Server, Docs, Wikis, FAQ & Chatbot v3.8.9
4.9.2 4.9.1 4.9.0 4.8.2 4.8.1 4.8.0 4.7.0 4.6.2 4.6.1 4.6.0 4.5.6 4.5.5 4.5.4 4.5.3 4.5.2 4.5.1 4.5.0 4.4.1 4.4.0 3.3.4 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 All 200 releases
← All changes | includes/Editors/BlockEditor/Blocks/FAQ.php +4 -48 4.8.23.8.9 View file →
@@ -1,14 +1,9 @@
1 1 <?php
2 +
2 3 namespace WPDeveloper\BetterDocs\Editors\BlockEditor\Blocks;
3 4
4 -if ( ! defined( 'ABSPATH' ) ) {
5 - exit;
6 -}
7 -
8 -
9 5 use WPDeveloper\BetterDocs\Editors\BlockEditor\Block;
10 -use WPDeveloper\BetterDocs\FrontEnd\WooProductFAQ as WooFAQRenderer;
11 6
12 7 class FAQ extends Block {
13 8 protected $editor_scripts = [
14 9 'betterdocs-faq',
@@ -43,10 +38,8 @@
43 38 'blockRoot' => 'better_docs',
44 39 'blockMeta' => null,
45 40 'faqLayout' => 'layout-1',
46 41 'faqSectionText' => 'Frequently Asked Questions',
47 - 'faqSectionTitleTag' => 'h2',
48 - 'faqGroupTitleTag' => 'h3',
49 42 'faqSectionTitleColor' => null,
50 43 'includeFaqGroup' => '',
51 44 'excludeFaqGroup' => '',
52 45 'faqGroupTitleColor' => null,
@@ -57,18 +50,13 @@
57 50 'faqGroupTitleTypography' => null,
58 51 'faqPerPage' => 9,
59 52
60 53 'showButtonIcon' => true,
61 - 'buttonColor' => '#528ffe',
62 - 'faqTaxonomy' => 'betterdocs_faq_category'
54 + 'buttonColor' => '#528ffe'
63 55 ];
64 56 }
65 57
66 58 public function render( $attributes, $content ) {
67 - if ( ( $this->attributes['faqTaxonomy'] ?? '' ) === 'product_assignments' ) {
68 - $this->render_product_assignments();
69 - return;
70 - }
71 59
72 60 add_filter( 'betterdocs_header_layout_sequence', [ $this, 'header_sequence' ], 10, 4 );
73 61 $this->views( 'layouts/faq' );
74 62 remove_filter( 'betterdocs_header_layout_sequence', [ $this, 'header_sequence' ], 10 );
@@ -73,31 +61,8 @@
73 61 $this->views( 'layouts/faq' );
74 62 remove_filter( 'betterdocs_header_layout_sequence', [ $this, 'header_sequence' ], 10 );
75 63 }
76 64
77 - private function render_product_assignments() {
78 - if ( ! class_exists( 'WooCommerce' ) || ! is_product() ) {
79 - return;
80 - }
81 -
82 - // In FSE templates, top-level blocks render outside the loop, so
83 - // get_the_ID() can be 0 — fall back to the queried product.
84 - $product_id = get_the_ID();
85 - if ( ! $product_id ) {
86 - $product_id = get_queried_object_id();
87 - }
88 - if ( ! $product_id ) {
89 - return;
90 - }
91 -
92 - /** @var WooFAQRenderer $renderer */
93 - $renderer = betterdocs()->container->get( WooFAQRenderer::class );
94 -
95 - // This block is the explicit placement; don't also inject into the tab/summary.
96 - $renderer->suppress_auto_placement();
97 - $renderer->render_for_product( $product_id, $this->attributes['faqLayout'] ?? null );
98 - }
99 -
100 65 public function get_groups_ids( $json ) {
101 66 $data = json_decode( $json, true );
102 67 $ids = '';
103 68 if ( $data !== null ) {
@@ -108,16 +73,12 @@
108 73 }
109 74
110 75 public function view_params() {
111 76 $attributes = &$this->attributes;
112 -
113 - // Sanitize the layout attribute to prevent path traversal (LFI).
114 - $attributes['faqLayout'] = sanitize_file_name( $attributes['faqLayout'] );
115 77 $exclude = $this->get_groups_ids( $attributes['excludeFaqGroup'] );
116 78 $include = $this->get_groups_ids( $attributes['includeFaqGroup'] );
117 - $taxonomy = sanitize_key( $attributes['faqTaxonomy'] ?? 'betterdocs_faq_category' );
118 79
119 - $terms_query = betterdocs()->query->faq_terms_query_args( $include, $exclude, [], $taxonomy );
80 + $terms_query = betterdocs()->query->faq_terms_query_args( $include, $exclude );
120 81
121 82 return wp_parse_args(
122 83 [
123 84 'enable' => true,
@@ -130,10 +91,8 @@
130 91 'class' => 'betterdocs-faq-' . $attributes['faqLayout'] . ' ' . $attributes['blockId'],
131 92 'groups' => $include,
132 93 'is_gutenberg' => true,
133 94 'faq_heading' => $attributes['faqSectionText'],
134 - 'faq_section_title_tag' => $attributes['faqSectionTitleTag'],
135 - 'faq_group_title_tag' => $attributes['faqGroupTitleTag'],
136 95 'faq_section_title_color' => $attributes['faqSectionTitleColor'],
137 96 'include_faq_group' => $this->string_to_array( $attributes['includeFaqGroup'] ),
138 97 'exclude_faq_group' => $this->string_to_array( $attributes['excludeFaqGroup'] ),
139 98 'faq_group_title_color' => $attributes['faqGroupTitleColor'],
@@ -144,12 +103,9 @@
144 103 'faq_group_title_typography' => $attributes['faqGroupTitleTypography'],
145 104 'faq_per_page' => $attributes['faqPerPage'],
146 105 'show_button_icon' => $attributes['showButtonIcon'],
147 106 'button_icon_position' => $attributes['faqLayout'] == 'layout-1' || $attributes['faqLayout'] == 'layout-3' || $attributes['faqLayout'] == 'layout-4' ? 'after' : 'before',
148 - 'button_color' => $attributes['buttonColor'],
149 - 'faq_taxonomy' => $taxonomy,
150 - // Per-block order; empty falls back to the global FAQ order.
151 - 'order' => isset( $attributes['faqOrder'] ) ? $attributes['faqOrder'] : ''
107 + 'button_color' => $attributes['buttonColor']
152 108 ]
153 109
154 110 ]
155 111 );