@@ -85,13 +85,42 @@ public function get_http_status_code( $status_code, $response ) {
8585return $ status_code ;
8686}
8787
88+ /**
89+ * Be a little flexible in how operation name is sent.
90+ *
91+ * @param array $request_data Request data.
92+ * @return string
93+ */
94+ private function get_operation_name ( $ request_data ) {
95+ foreach ( [ 'operationName ' , 'operation_name ' ] as $ key ) {
96+ if ( ! empty ( $ request_data [ $ key ] ) ) {
97+ return $ request_data [ $ key ];
98+ }
99+ }
100+
101+ return 'UnnamedQuery ' ;
102+ }
103+
88104/**
89105 * Attempts to load a persisted query corresponding to a query ID (hash).
90106 *
91107 * @param string $query_id Query ID
92108 * @return string Query
93109 */
94- public function load ( $ query_id ) {
110+ private function load ( $ query_id ) {
111+ /**
112+ * Allow other implementors to load queries.
113+ *
114+ * @param string $query Persisted query.
115+ * @param string $query_id Query ID.
116+ * @since 1.1.0
117+ */
118+ $ query = apply_filters ( "{$ this ->namespace }_load_query " , null , $ query_id );
119+ if ( $ query ) {
120+ return $ query ;
121+ }
122+
123+ // If query has been persisted to our custom post type, return it.
95124$ post = get_page_by_path ( $ query_id , 'OBJECT ' , $ this ->post_type );
96125
97126return isset ( $ post ->post_content ) ? $ post ->post_content : null ;
@@ -116,7 +145,7 @@ public function process_request_data( $request_data ) {
116145
117146// Client sends *both* queryId and query == request to persist query.
118147if ( $ has_query_id && $ has_query ) {
119- $ this ->save ( $ query_id , $ request_data ['query ' ], $ request_data[ ' operationName ' ] );
148+ $ this ->save ( $ query_id , $ request_data ['query ' ], $ this -> get_operation_name ( $ request_data ) );
120149}
121150
122151// Client sends queryId but *not* query == optimistic request to use
@@ -137,36 +166,34 @@ public function process_request_data( $request_data ) {
137166}
138167
139168/**
140- * Register the persisted query post type. We could filter a lot of individual
141- * values here, but we won't. If further customization is wanted, filter
142- * register_post_type_args.
169+ * Register the persisted query post type.
143170 *
144171 * @return void
145172 */
146173private function register_post_type () {
174+ $ post_type_args = [
175+ 'label ' => 'Queries ' ,
176+ 'public ' => false ,
177+ 'query_var ' => false ,
178+ 'rewrite ' => false ,
179+ 'show_in_rest ' => false ,
180+ 'show_in_graphql ' => false ,
181+ 'graphql_single_name ' => 'persistedQuery ' ,
182+ 'graphql_plural_name ' => 'persistedQueries ' ,
183+ 'show_ui ' => false ,
184+ 'supports ' => [ 'title ' , 'editor ' ],
185+ ];
186+
147187/**
148- * Whether persisted queries can be themselves queried via GraphQL. 💅
188+ * Post type args for persisted queries. Filter this to expose the post type
189+ * in the UI or in GraphQL.
149190 *
150- * @param bool $show_in_graphql Show in GraphQL?
151- * @since 1.0 .0
191+ * @param bool $post_type_args Register post type args.
192+ * @since 1.1 .0
152193 */
153- $ show_in_graphql = apply_filters ( "{$ this ->namespace }_show_in_graphql " , false );
154-
155- register_post_type (
156- $ this ->post_type ,
157- [
158- 'label ' => 'Queries ' ,
159- 'public ' => false ,
160- 'query_var ' => false ,
161- 'rewrite ' => false ,
162- 'show_in_rest ' => false ,
163- 'show_in_graphql ' => $ show_in_graphql ,
164- 'graphql_single_name ' => 'persistedQuery ' ,
165- 'graphql_plural_name ' => 'persistedQueries ' ,
166- 'show_ui ' => is_admin (),
167- 'supports ' => [ 'title ' , 'editor ' ],
168- ]
169- );
194+ $ post_type_args = apply_filters ( "{$ this ->namespace }_post_type_args " , $ post_type_args );
195+
196+ register_post_type ( $ this ->post_type , $ post_type_args );
170197}
171198
172199/**
@@ -177,19 +204,34 @@ private function register_post_type() {
177204 * @param string $name Operation name
178205 * @return void
179206 */
180- public function save ( $ query_id , $ query , $ name = 'UnnamedQuery ' ) {
207+ private function save ( $ query_id , $ query , $ name = 'UnnamedQuery ' ) {
181208// Check to see if the query has already been persisted. If so, we're done.
182209if ( ! empty ( $ this ->load ( $ query_id ) ) ) {
183210return ;
184211}
185212
186- // Persist the query.
187- wp_insert_post ( [
213+ $ post_data = [
188214'post_content ' => $ query ,
189215'post_name ' => $ query_id ,
190216'post_title ' => $ name ,
191217'post_status ' => 'publish ' ,
192218'post_type ' => $ this ->post_type ,
193- ] );
219+ ];
220+
221+ /**
222+ * Allow implementors to override persisted query.
223+ *
224+ * @param bool $post_data Post data for persisted query.
225+ * @param string $query_id Query ID.
226+ * @since 1.1.0
227+ */
228+ $ post_data = apply_filters ( "{$ this ->namespace }_save_query " , $ post_data , $ query_id );
229+
230+ if ( empty ( $ post_data ) ) {
231+ return ;
232+ }
233+
234+ // Persist the query.
235+ wp_insert_post ( $ post_data );
194236}
195237}
0 commit comments