diff --git a/inc/Framework.php b/inc/Framework.php
index 95267cc0..810d3c06 100644
--- a/inc/Framework.php
+++ b/inc/Framework.php
@@ -4,6 +4,7 @@
use BEA\Theme\Framework\Services\Acf;
use BEA\Theme\Framework\Services\Assets;
+use BEA\Theme\Framework\Services\Facet_WP;
use BEA\Theme\Framework\Services\Performance;
use BEA\Theme\Framework\Services\Assets_JS_Async;
use BEA\Theme\Framework\Services\Editor;
@@ -40,6 +41,7 @@ class Framework {
Svg::class,
Acf::class,
Menu::class,
+ Facet_WP::class,
// Services as Tools
Body_Class::class,
diff --git a/inc/Services/Facet_WP.php b/inc/Services/Facet_WP.php
new file mode 100644
index 00000000..2825c460
--- /dev/null
+++ b/inc/Services/Facet_WP.php
@@ -0,0 +1,234 @@
+ 1,
+ 'per_page' => 10,
+ 'total_rows' => 1,
+ ];
+ $params = array_merge( $defaults, $params );
+ $output = '';
+ $page = (int) $params['page'];
+ $total_pages = (int) $params['total_pages'];
+
+ // Only show pagination when > 1 page
+ if ( 1 < $total_pages ) {
+
+ $text_page = esc_html__( 'Page', 'fwp-front' );
+ $text_of = esc_html__( 'of', 'fwp-front' );
+ $step = 10;
+
+ $output .= '";
+
+ if ( $page > 1 ) {
+ $output .= sprintf(
+ '',
+ ( $page - 1 )
+ );
+ } else {
+ $output .= '';
+ }
+
+ if ( 3 < $page ) {
+ $output .= sprintf(
+ '',
+ __( 'First page', 'framework-textdomain' )
+ );
+ }
+
+ if ( 1 < ( $page - $step ) ) {
+ $output .= '...';
+ }
+
+ for ( $i = 2; $i > 0; $i -- ) {
+ if ( 0 < ( $page - $i ) ) {
+ $output .= '';
+ }
+ }
+
+ // Current page
+ $output .= '' . __( 'Current page', 'framework-textdomain' ) . ' ' . $page . '';
+
+ for ( $i = 1; $i <= 2; $i ++ ) {
+ if ( $total_pages >= ( $page + $i ) ) {
+ $output .= '';
+ }
+ }
+
+ if ( $total_pages > ( $page + $step ) ) {
+ $output .= '...';
+ }
+
+ if ( $total_pages > ( $page + 2 ) ) {
+ $output .= sprintf(
+ '',
+ $total_pages,
+ __( 'Last page', 'framework-textdomain' )
+ );
+ }
+
+ if ( $page < $total_pages && $total_pages > 1 ) {
+ $output .= '';
+ } else {
+ $output .= '';
+ }
+ }
+
+ return $output;
+ }
+
+ /**
+ * Customize pagination facet output
+ * This function apply only on pagination facets : facetwp_display( 'facet', 'pagination' );
+ * For customization of the old way to display a pager, see accessible_facetwp_pager_html function.
+ *
+ * https://facetwp.com/help-center/developers/hooks/output-hooks/facetwp_facet_pager_link/
+ *
+ * @param $output
+ * @param $params
+ *
+ * @return string
+ *
+ * @author Marie Comet
+ *
+ */
+ public function facetwp_facet_pager_link( $html, $params ): string {
+ // Replace current link by a span
+ if ( str_contains( $html, 'active' ) ) {
+ $html = str_replace( '', '', $html );
+ }
+
+ // Replace links by buttons and add class
+ $html = str_replace( [ '' ], $html );
+
+ // Remove link tag for dots
+ if ( 'dots' === $params['extra_class'] ) {
+ $html = str_replace( '…', '…', $html );
+ }
+
+ return $html;
+ }
+
+ /**
+ * Add labels or aria-label to facets
+ * Put in $excluded_facet_names the facets names for which you want to do not add the label.
+ * Put in $excluded_empty_facets the facets types for which you want to hide the label if the facet is empty.
+ *
+ * @param string $html
+ * @param array $args
+ *
+ * @return string
+ */
+ public function facetwp_add_labels( string $html, array $args ): string {
+ $facet_name = $args['facet']['name'];
+ $facet_label = $args['facet']['label'];
+ if ( function_exists( 'facetwp_i18n' ) ) {
+ $facet_label = facetwp_i18n( $facet_label );
+ }
+
+ // Return default HTML if the facet is excluded by its name
+ $excluded_facet_names = apply_filters( 'facetwp_a11y_excluded_facet_names', [] );
+ if ( in_array( $facet_name, $excluded_facet_names, true ) ) {
+ return $html;
+ }
+
+ // Add aria-label attribute to per_page select
+ if ( 'per_page' === $facet_name ) {
+ return str_replace(
+ '