# Filters

### wp\_query\_engine\_templates

Output templates can be added, removed, or modified using the `wp_query_engine_templates` filter.

Template registration is not required for use in a shortcode, but *is* required to add custom templates to select lists, such as in the Beaver Builder module or sidebar widget.

```php
function register_templates( $templates ) {
    $templates['My Custom Template'] = get_stylesheet_directory() . '/templates/my_custom_template.php';
    return $templates;
}
add_filter( 'wp_query_engine_templates', 'register_templates' );
```

### wp\_query\_engine\_template

Force the use of a specific template, regardless of which template is selected. The `wp_query_engine_template` filter allows developers to select a template programmatically at the time of output, instead of specifying beforehand.

```php
function force_template( $template_name, $atts, $query ) {
	if( $atts['context'] === 'my_custom_context' ) {
		$template_name = 'templates/my_custom_template.php';
	}
    return $template_name;
}
add_filter( 'wp_query_engine_template', 'force_template', 10, 3 );
```

### wp\_query\_engine\_args\_raw

Filter the query arguments before they are processed. This allows you to add additional arguments, or control the arguments  within your code, instead of the shortcode or other means.

```php
function force_query_args( $args ) {
    if( isset( $args['post_type'] ) && $args['post_type'] === 'recipe' ) {
        $args['tag__in'] = array( 'featured' );
    }
    return $args;
}
add_filter( 'wp_query_engine_args_raw', 'force_query_args' );
```

### wp\_query\_engine\_args

Filter the query arguments after processing. This allows developers to apply some specific formatting to the arguments after they've been normalized, but before being passed to WP\_QUERY. At this point, the post id's that will be queried is already set, so fewer arguments can be applied.

```php
function force_query_args( $args ) {
    if( isset( $args['post_type'] ) && $args['post_type'] === 'recipe' ) {
        $args['post_per_page'] = -1;
    }
    return $args;
}
add_filter( 'wp_query_engine_args', 'force_query_args' );
```

### wp\_query\_include\_loop

By default, the template includes a loop with specific template actions already defined. The loop uses the template name to define custom actions.

The template name is normalized by removing spaces, dashes, and .php. If a template is defined by name, such as *My Custom Template*, it will be normalized to *my\_custom\_template*. A name specified by path, such as *templates/homepage\_loop.php*, it will be normalized to *templates\_homepage\_loop*.

If you do not wish to include the default loop, and instead want to define your own loop in your custom template files, you can using the `wp_query_include_loop` filter.

```php
function dont_include_wp_query_loop( $include, $atts ) {
	if( $atts['template'] === 'My Custom Template' ) {
		return false;
	}
	return true;
}
add_action( 'wp_query_include_loop', 'dont_include_wp_query_loop' );
```

The loop is includes after the template files, however. So it can be defined inside specific templates, with a simpler function

```php
add_action( 'wp_query_include_loop', '__return_false' );
```

Be careful, however, not to define this globally in your functions.php file unless an alternative loop is provided for the default templates, or they will not output.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.wpcodelabs.com/plugins/wp-query-engine/untitled.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
