| @@ -1,9 +1,14 @@ | ||
| 1 | 1 | <?php |
| 2 | +namespace WPDeveloper\BetterDocs\Shortcodes; | |
| 2 | 3 | |
| 3 | -namespace WPDeveloper\BetterDocs\Shortcodes; | |
| 4 | +if ( ! defined( 'ABSPATH' ) ) { | |
| 5 | + exit; | |
| 6 | +} | |
| 4 | 7 | |
| 8 | + | |
| 5 | 9 | use WPDeveloper\BetterDocs\Core\Shortcode; |
| 10 | +use WPDeveloper\BetterDocs\Utils\Helper; | |
| 6 | 11 | |
| 7 | 12 | class FaqList extends Shortcode { |
| 8 | 13 | protected $layout = 'modern'; |
| 9 | 14 | protected $icon_hook = 'betterdocs_faq_post_after'; |
| @@ -52,12 +57,24 @@ | ||
| 52 | 57 | 'faq_per_page' => 9, |
| 53 | 58 | 'show_button_icon' => true, |
| 54 | 59 | 'button_icon_position' => 'after', |
| 55 | 60 | 'button_color' => '#528ffe', |
| 56 | - 'is_gutenberg' => false | |
| 61 | + 'is_gutenberg' => false, | |
| 62 | + 'faq_taxonomy' => 'betterdocs_faq_category', | |
| 63 | + // Per-placement order override. Empty = use the global FAQ Builder | |
| 64 | + // order (`betterdocs_faq_order` option). One of: default, | |
| 65 | + // most_recent, least_recent, a_to_z, z_to_a, most_questions. | |
| 66 | + 'order' => '' | |
| 57 | 67 | ]; |
| 58 | 68 | } |
| 59 | 69 | |
| 70 | + /** | |
| 71 | + * Allowed per-placement order keys, mirroring the FAQ Builder header dropdown. | |
| 72 | + * | |
| 73 | + * @var string[] | |
| 74 | + */ | |
| 75 | + protected $allowed_order_keys = [ 'default', 'most_recent', 'least_recent', 'a_to_z', 'z_to_a', 'most_questions' ]; | |
| 76 | + | |
| 60 | 77 | public function icons( $faq_toggle ) { |
| 61 | 78 | $faq_markup = '<svg class="betterdocs-faq-iconminus" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"' .($faq_toggle ? " style='display:inline;'" : ""). 'stroke-width="2"><g fill="none" stroke="' . esc_attr( $this->attributes['button_color'] ) . '" stroke-linecap="round" stroke-miterlimit="10" stroke-linejoin="round"><path d="M17 12H7"></path><circle cx="12" cy="12" r="11"></circle></g></svg>'; |
| 62 | 79 | $faq_markup .= '<svg class="betterdocs-faq-iconplus" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"'.($faq_toggle ? " style='display:none;'" : "").'><g stroke-width="2" fill="none" stroke="' . esc_attr( $this->attributes['button_color'] ) . '" stroke-linecap="square" stroke-miterlimit="10"><path d="M12 7v10M17 12H7"></path><circle cx="12" cy="12" r="11"></circle></g></svg>'; |
| 63 | 80 | |
| @@ -75,15 +92,32 @@ | ||
| 75 | 92 | } else { |
| 76 | 93 | add_action( $this->icon_hook, [ $this, 'icons' ] ); |
| 77 | 94 | } |
| 78 | 95 | |
| 96 | + // When this placement sets a valid `order`, scope it to this render only | |
| 97 | + // (via the existing `betterdocs_faq_order_key` filter) so it overrides | |
| 98 | + // the global FAQ Builder order without affecting other placements. | |
| 99 | + $order_override = is_string( $this->attributes['order'] ) ? trim( $this->attributes['order'] ) : ''; | |
| 100 | + $order_filter = null; | |
| 101 | + if ( $order_override && in_array( $order_override, $this->allowed_order_keys, true ) ) { | |
| 102 | + $order_filter = function () use ( $order_override ) { | |
| 103 | + return $order_override; | |
| 104 | + }; | |
| 105 | + add_filter( 'betterdocs_faq_order_key', $order_filter, 20 ); | |
| 106 | + } | |
| 107 | + | |
| 79 | 108 | $this->views( 'shortcodes/faq' ); |
| 80 | 109 | |
| 110 | + if ( $order_filter ) { | |
| 111 | + remove_filter( 'betterdocs_faq_order_key', $order_filter, 20 ); | |
| 112 | + } | |
| 113 | + | |
| 81 | 114 | remove_action( $this->icon_hook, [ $this, 'icons' ] ); |
| 82 | 115 | } |
| 83 | 116 | |
| 84 | 117 | public function view_params() { |
| 85 | - $terms_query = $this->query->faq_terms_query_args( $this->attributes['groups'], $this->attributes['group_exclude'] ); | |
| 118 | + $taxonomy = sanitize_key( $this->attributes['faq_taxonomy'] ); | |
| 119 | + $terms_query = $this->query->faq_terms_query_args( $this->attributes['groups'], $this->attributes['group_exclude'], [], $taxonomy ); | |
| 86 | 120 | |
| 87 | 121 | $wrapper_attr = [ |
| 88 | 122 | 'class' => [ |
| 89 | 123 | 'betterdocs-faq-wrapper', |
| @@ -98,9 +132,9 @@ | ||
| 98 | 132 | 'wrapper_attr' => $wrapper_attr, |
| 99 | 133 | 'widget' => $this, |
| 100 | 134 | 'layout' => 'list', |
| 101 | 135 | 'terms_query_args' => $terms_query, |
| 102 | - 'faq_schema' => $this->attributes['faq_schema'] | |
| 136 | + 'faq_schema' => $this->attributes['faq_schema'] && ! Helper::seo_plugin_outputs_faq_schema() | |
| 103 | 137 | ] |
| 104 | 138 | ); |
| 105 | 139 | } |
| 106 | 140 | } |