BeaverBuilder.php
3.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
<?php
/**
* SearchWP BeaverBuilder.
*
* @package SearchWP
* @author Jon Christopher
*/
namespace SearchWP\Integrations;
/**
* Class BeaverBuilder is responsible for customizing SearchWP's Native implementation to work with BeaverBuilder queries.
*
* @since 4.1.5
*/
class BeaverBuilder extends PageBuilder {
/**
* Name used for canonical reference to Integration.
*
* @since 4.1.5
* @var string
*/
protected $name = 'beaver-builder';
/**
* Constructor.
*
* @since 4.1.8
* @return void
*/
public function __construct() {
if ( ! has_action( 'parse_query', [ $this, 'maybe_integrate_themer' ] ) ) {
add_action( 'parse_query', [ $this, 'maybe_integrate_themer' ] );
}
add_filter( 'fl_builder_loop_query_args', [ $this, 'maybe_hijack_search_module' ], 20 );
}
/**
* Allow SearchWP to take over any Beaver Builder WP_Query doing a search.
*
* @since 4.1.14
* @param mixed $query_args Incoming Beaver Builder WP_Query args.
* @return mixed Outgoing WP_Query args.
*/
public function maybe_hijack_search_module( $query_args ) {
if ( ! apply_filters(
'searchwp\integration\beaver-builder-search-module',
is_plugin_active( 'bb-plugin/fl-builder.php' ) )
) {
return;
}
// If there's no search, bail out.
if ( ! self::is_applicable( $query_args ) ) {
return $query_args;
}
// Force SearchWP to run on this query.
add_filter( 'searchwp\native\force', function( $force, $args ) {
return self::is_applicable( $args['query']->query_vars );
}, 20, 2 );
add_filter( 'searchwp\native\strict', function( $strict, $query ) {
return ! self::is_applicable( $query->query_vars );
}, 20, 2 );
add_filter( 'searchwp\native\args', function( $args, $query ) {
$args['engine'] = apply_filters( 'searchwp\integration\pagebuilder\engine', 'default', [
'context' => $this->name . SEARCHWP_SEPARATOR . 'module',
'query' => $query,
] );
return $args;
}, 20, 2 );
return $query_args;
}
/**
* Returns whether the query args indicate this is a Beaver Builder search query.
*
* @since 4.1.14
* @param array $query_args Incoming query args.
* @return bool Whether applicable.
*/
public static function is_applicable( $query_args ) {
return isset( $query_args['fl_builder_loop'] )
&& ! empty( $query_args['fl_builder_loop'] )
&& isset( $query_args['s'] )
&& ! empty( trim( $query_args['s'] ) );
}
/**
* Integrate when Beaver Builder Themer is used for a Search Archive.
*
* @since 4.1.8
*/
public function maybe_integrate_themer() {
if ( ! apply_filters( 'searchwp\integration\beaver-builder-themer', false ) ) {
return;
}
if ( ! is_search() ) {
return;
}
if ( ! class_exists( '\\FLThemeBuilderLayoutData' ) ) {
return;
}
// Make sure Beaver Builder Themer is being used for this archive.
$layouts = \FLThemeBuilderLayoutData::get_current_page_layouts( 'archive' );
if ( 0 == count( $layouts ) ) {
return;
}
$types = wp_list_pluck( $layouts, 'type' );
$locations = call_user_func_array( 'array_merge',
array_values( wp_list_pluck( $layouts, 'locations' ) ) );
if ( ! in_array( 'archive', $types, true ) || ! in_array( 'general:search', $locations, true ) ) {
return;
}
$this->modify_native_behavior();
// Prevent redundancy.
remove_action( 'parse_query', [ $this, 'maybe_integrate' ] );
}
}