ublic $is_day = false;
/**
* Signifies whether the current query is for a specific time.
*
* @since 1.5.0
* @var bool
*/
public $is_time = false;
/**
* Signifies whether the current query is for an author archive.
*
* @since 1.5.0
* @var bool
*/
public $is_author = false;
/**
* Signifies whether the current query is for a category archive.
*
* @since 1.5.0
* @var bool
*/
public $is_category = false;
/**
* Signifies whether the current query is for a tag archive.
*
* @since 2.3.0
* @var bool
*/
public $is_tag = false;
/**
* Signifies whether the current query is for a taxonomy archive.
*
* @since 2.5.0
* @var bool
*/
public $is_tax = false;
/**
* Signifies whether the current query is for a search.
*
* @since 1.5.0
* @var bool
*/
public $is_search = false;
/**
* Signifies whether the current query is for a feed.
*
* @since 1.5.0
* @var bool
*/
public $is_feed = false;
/**
* Signifies whether the current query is for a comment feed.
*
* @since 2.2.0
* @var bool
*/
public $is_comment_feed = false;
/**
* Signifies whether the current query is for trackback endpoint call.
*
* @since 1.5.0
* @var bool
*/
public $is_trackback = false;
/**
* Signifies whether the current query is for the site homepage.
*
* @since 1.5.0
* @var bool
*/
public $is_home = false;
/**
* Signifies whether the current query is for the Privacy Policy page.
*
* @since 5.2.0
* @var bool
*/
public $is_privacy_policy = false;
/**
* Signifies whether the current query couldn't find anything.
*
* @since 1.5.0
* @var bool
*/
public $is_404 = false;
/**
* Signifies whether the current query is for an embed.
*
* @since 4.4.0
* @var bool
*/
public $is_embed = false;
/**
* Signifies whether the current query is for a paged result and not for the first page.
*
* @since 1.5.0
* @var bool
*/
public $is_paged = false;
/**
* Signifies whether the current query is for an administrative interface page.
*
* @since 1.5.0
* @var bool
*/
public $is_admin = false;
/**
* Signifies whether the current query is for an attachment page.
*
* @since 2.0.0
* @var bool
*/
public $is_attachment = false;
/**
* Signifies whether the current query is for an existing single post of any post type
* (post, attachment, page, custom post types).
*
* @since 2.1.0
* @var bool
*/
public $is_singular = false;
/**
* Signifies whether the current query is for the robots.txt file.
*
* @since 2.1.0
* @var bool
*/
public $is_robots = false;
/**
* Signifies whether the current query is for the favicon.ico file.
*
* @since 5.4.0
* @var bool
*/
public $is_favicon = false;
/**
* Signifies whether the current query is for the page_for_posts page.
*
* Basically, the homepage if the option isn't set for the static homepage.
*
* @since 2.1.0
* @var bool
*/
public $is_posts_page = false;
/**
* Signifies whether the current query is for a post type archive.
*
* @since 3.1.0
* @var bool
*/
public $is_post_type_archive = false;
/**
* Stores the ->query_vars state like md5(serialize( $this->query_vars ) ) so we know
* whether we have to re-parse because something has changed
*
* @since 3.1.0
* @var bool|string
*/
private $query_vars_hash = false;
/**
* Whether query vars have changed since the initial parse_query() call. Used to catch modifications to query vars made
* via pre_get_posts hooks.
*
* @since 3.1.1
*/
private $query_vars_changed = true;
/**
* Set if post thumbnails are cached
*
* @since 3.2.0
* @var bool
*/
public $thumbnails_cached = false;
/**
* Controls whether an attachment query should include filenames or not.
*
* @since 6.0.3
* @var bool
*/
protected $allow_query_attachment_by_filename = false;
/**
* Cached list of search stopwords.
*
* @since 3.7.0
* @var array
*/
private $stopwords;
private $compat_fields = array( 'query_vars_hash', 'query_vars_changed' );
private $compat_methods = array( 'init_query_flags', 'parse_tax_query' );
/**
* Resets query flags to false.
*
* The query flags are what page info WordPress was able to figure out.
*
* @since 2.0.0
*/
private function init_query_flags() {
$this->is_single = false;
$this->is_preview = false;
$this->is_page = false;
$this->is_archive = false;
$this->is_date = false;
$this->is_year = false;
$this->is_month = false;
$this->is_day = false;
$this->is_time = false;
$this->is_author = false;
$this->is_category = false;
$this->is_tag = false;
$this->is_tax = false;
$this->is_search = false;
$this->is_feed = false;
$this->is_comment_feed = false;
$this->is_trackback = false;
$this->is_home = false;
$this->is_privacy_policy = false;
$this->is_404 = false;
$this->is_paged = false;
$this->is_admin = false;
$this->is_attachment = false;
$this->is_singular = false;
$this->is_robots = false;
$this->is_favicon = false;
$this->is_posts_page = false;
$this->is_post_type_archive = false;
}
/**
* Initiates object properties and sets default values.
*
* @since 1.5.0
*/
public function init() {
unset( $this->posts );
unset( $this->query );
$this->query_vars = array();
unset( $this->queried_object );
unset( $this->queried_object_id );
$this->post_count = 0;
$this->current_post = -1;
$this->in_the_loop = false;
$this->before_loop = true;
unset( $this->request );
unset( $this->post );
unset( $this->comments );
unset( $this->comment );
$this->comment_count = 0;
$this->current_comment = -1;
$this->found_posts = 0;
$this->max_num_pages = 0;
$this->max_num_comment_pages = 0;
$this->init_query_flags();
}
/**
* Reparses the query vars.
*
* @since 1.5.0
*/
public function parse_query_vars() {
$this->parse_query();
}
/**
* Fills in the query variables, which do not exist within the parameter.
*
* @since 2.1.0
* @since 4.5.0 Removed the `comments_popup` public query variable.
*
* @param array $query_vars Defined query variables.
* @return array Complete query variables with undefined ones filled in empty.
*/
public function fill_query_vars( $query_vars ) {
$keys = array(
'error',
'm',
'p',
'post_parent',
'subpost',
'subpost_id',
'attachment',
'attachment_id',
'name',
'pagename',
'page_id',
'second',
'minute',
'hour',
'day',
'monthnum',
'year',
'w',
'category_name',
'tag',
'cat',
'tag_id',
'author',
'author_name',
'feed',
'tb',
'paged',
'meta_key',
'meta_value',
'preview',
's',
'sentence',
'title',
'fields',
'menu_order',
'embed',
);
foreach ( $keys as $key ) {
if ( ! isset( $query_vars[ $key ] ) ) {
$query_vars[ $key ] = '';
}
}
$array_keys = array(
'category__in',
'category__not_in',
'category__and',
'post__in',
'post__not_in',
'post_name__in',
'tag__in',
'tag__not_in',
'tag__and',
'tag_slug__in',
'tag_slug__and',
'post_parent__in',
'post_parent__not_in',
'author__in',
'author__not_in',
'search_columns',
);
foreach ( $array_keys as $key ) {
if ( ! isset( $query_vars[ $key ] ) ) {
$query_vars[ $key ] = array();
}
}
return $query_vars;
}
/**
* Parses a query string and sets query type booleans.
*
* @since 1.5.0
* @since 4.2.0 Introduced the ability to order by specific clauses of a `$meta_query`, by passing the clause's
* array key to `$orderby`.
* @since 4.4.0 Introduced `$post_name__in` and `$title` parameters. `$s` was updated to support excluded
* search terms, by prepending a hyphen.
* @since 4.5.0 Removed the `$comments_popup` parameter.
* Introduced the `$comment_status` and `$ping_status` parameters.
* Introduced `RAND(x)` syntax for `$orderby`, which allows an integer seed value to random sorts.
* @since 4.6.0 Added 'post_name__in' support for `$orderby`. Introduced the `$lazy_load_term_meta` argument.
* @since 4.9.0 Introduced the `$comment_count` parameter.
* @since 5.1.0 Introduced the `$meta_compare_key` parameter.
* @since 5.3.0 Introduced the `$meta_type_key` parameter.
* @since 6.1.0 Introduced the `$update_menu_item_cache` parameter.
* @since 6.2.0 Introduced the `$search_columns` parameter.
*
* @param string|array $query {
* Optional. Array or string of Query parameters.
*
* @type int $attachment_id Attachment post ID. Used for 'attachment' post_type.
* @type int|string $author Author ID, or comma-separated list of IDs.
* @type string $author_name User 'user_nicename'.
* @type int[] $author__in An array of author IDs to query from.
* @type int[] $author__not_in An array of author IDs not to query from.
* @type bool $cache_results Whether to cache post information. Default true.
* @type int|string $cat Category ID or comma-separated list of IDs (this or any children).
* @type int[] $category__and An array of category IDs (AND in).
* @type int[] $category__in An array of category IDs (OR in, no children).
* @type int[] $category__not_in An array of category IDs (NOT in).
* @type string $category_name Use category slug (not name, this or any children).
* @type array|int $comment_count Filter results by comment count. Provide an integer to match
* comment count exactly. Provide an array with integer 'value'
* and 'compare' operator ('=', '!=', '>', '>=', '<', '<=' ) to
* compare against comment_count in a specific way.
* @type string $comment_status Comment status.
* @type int $comments_per_page The number of comments to return per page.
* Default 'comments_per_page' option.
* @type array $date_query An associative array of WP_Date_Query arguments.
* See WP_Date_Query::__construct().
* @type int $day Day of the month. Default empty. Accepts numbers 1-31.
* @type bool $exact Whether to search by exact keyword. Default false.
* @type string $fields Post fields to query for. Accepts:
* - '' Returns an array of complete post objects (`WP_Post[]`).
* - 'ids' Returns an array of post IDs (`int[]`).
* - 'id=>parent' Returns an associative array of parent post IDs,
* keyed by post ID (`int[]`).
* Default ''.
* @type int $hour Hour of the day. Default empty. Accepts numbers 0-23.
* @type int|bool $ignore_sticky_posts Whether to ignore sticky posts or not. Setting this to false
* excludes stickies from 'post__in'. Accepts 1|true, 0|false.
* Default false.
* @type int $m Combination YearMonth. Accepts any four-digit year and month
* numbers 01-12. Default empty.
* @type string|string[] $meta_key Meta key or keys to filter by.
* @type string|string[] $meta_value Meta value or values to filter by.
* @type string $meta_compare MySQL operator used for comparing the meta value.
* See WP_Meta_Query::__construct() for accepted values and default value.
* @type string $meta_compare_key MySQL operator used for comparing the meta key.
* See WP_Meta_Query::__construct() for accepted values and default value.
* @type string $meta_type MySQL data type that the meta_value column will be CAST to for comparisons.
* See WP_Meta_Query::__construct() for accepted values and default value.
* @type string $meta_type_key MySQL data type that the meta_key column will be CAST to for comparisons.
* See WP_Meta_Query::__construct() for accepted values and default value.
* @type array $meta_query An associative array of WP_Meta_Query arguments.
* See WP_Meta_Query::__construct() for accepted values.
* @type int $menu_order The menu order of the posts.
* @type int $minute Minute of the hour. Default empty. Accepts numbers 0-59.
* @type int $monthnum The two-digit month. Default empty. Accepts numbers 1-12.
* @type string $name Post slug.
* @type bool $nopaging Show all posts (true) or paginate (false). Default false.
* @type bool $no_found_rows Whether to skip counting the total rows found. Enabling can improve
* performance. Default false.
* @type int $offset The number of posts to offset before retrieval.
* @type string $order Designates ascending or descending order of posts. Default 'DESC'.
* Accepts 'ASC', 'DESC'.
* @type string|array $orderby Sort retrieved posts by parameter. One or more options may be passed.
* To use 'meta_value', or 'meta_value_num', 'meta_key=keyname' must be
* also be defined. To sort by a specific `$meta_query` clause, use that
* clause's array key. Accepts:
* - 'none'
* - 'name'
* - 'author'
* - 'date'
* - 'title'
* - 'modified'
* - 'menu_order'
* - 'parent'
* - 'ID'
* - 'rand'
* - 'relevance'
* - 'RAND(x)' (where 'x' is an integer seed value)
* - 'comment_count'
* - 'meta_value'
* - 'meta_value_num'
* - 'post__in'
* - 'post_name__in'
* - 'post_parent__in'
* - The array keys of `$meta_query`.
* Default is 'date', except when a search is being performed, when
* the default is 'relevance'.
* @type int $p Post ID.
* @type int $page Show the number of posts that would show up on page X of a
* static front page.
* @type int $paged The number of the current page.
* @type int $page_id Page ID.
* @type string $pagename Page slug.
* @type string $perm Show posts if user has the appropriate capability.
* @type string $ping_status Ping status.
* @type int[] $post__in An array of post IDs to retrieve, sticky posts will be included.
* @type int[] $post__not_in An array of post IDs not to retrieve. Note: a string of comma-
* separated IDs will NOT work.
* @type string $post_mime_type The mime type of the post. Used for 'attachment' post_type.
* @type string[] $post_name__in An array of post slugs that results must match.
* @type int $post_parent Page ID to retrieve child pages for. Use 0 to only retrieve
* top-level pages.
* @type int[] $post_parent__in An array containing parent page IDs to query child pages from.
* @type int[] $post_parent__not_in An array containing parent page IDs not to query child pages from.
* @type string|string[] $post_type A post type slug (string) or array of post type slugs.
* Default 'any' if using 'tax_query'.
* @type string|string[] $post_status A post status (string) or array of post statuses.
* @type int $posts_per_page The number of posts to query for. Use -1 to request all posts.
* @type int $posts_per_archive_page The number of posts to query for by archive page. Overrides
* 'posts_per_page' when is_archive(), or is_search() are true.
* @type string $s Search keyword(s). Prepending a term with a hyphen will
* exclude posts matching that term. Eg, 'pillow -sofa' will
* return posts containing 'pillow' but not 'sofa'. The
* character used for exclusion can be modified using the
* the 'wp_query_search_exclusion_prefix' filter.
* @type string[] $search_columns Array of column names to be searched. Accepts 'post_title',
* 'post_excerpt' and 'post_content'. Default empty array.
* @type int $second Second of the minute. Default empty. Accepts numbers 0-59.
* @type bool $sentence Whether to search by phrase. Default false.
* @type bool $suppress_filters Whether to suppress filters. Default false.
* @type string $tag Tag slug. Comma-separated (either), Plus-separated (all).
* @type int[] $tag__and An array of tag IDs (AND in).
* @type int[] $tag__in An array of tag IDs (OR in).
* @type int[] $tag__not_in An array of tag IDs (NOT in).
* @type int $tag_id Tag id or comma-separated list of IDs.
* @type string[] $tag_slug__and An array of tag slugs (AND in).
* @type string[] $tag_slug__in An array of tag slugs (OR in). unless 'ignore_sticky_posts' is
* true. Note: a string of comma-separated IDs will NOT work.
* @type array $tax_query An associative array of WP_Tax_Query arguments.
* See WP_Tax_Query::__construct().
* @type string $title Post title.
* @type bool $update_post_meta_cache Whether to update the post meta cache. Default true.
* @type bool $update_post_term_cache Whether to update the post term cache. Default true.
* @type bool $update_menu_item_cache Whether to update the menu item cache. Default false.
* @type bool $lazy_load_term_meta Whether to lazy-load term meta. Setting to false will
* disable cache priming for term meta, so that each
* get_term_meta() call will hit the database.
* Defaults to the value of `$update_post_term_cache`.
* @type int $w The week number of the year. Default empty. Accepts numbers 0-53.
* @type int $year The four-digit year. Default empty. Accepts any four-digit year.
* }
*/
public function parse_query( $query = '' ) {
if ( ! empty( $query ) ) {
$this->init();
$this->query = wp_parse_args( $query );
$this->query_vars = $this->query;
} elseif ( ! isset( $this->query ) ) {
$this->query = $this->query_vars;
}
$this->query_vars = $this->fill_query_vars( $this->query_vars );
$qv = &$this->query_vars;
$this->query_vars_changed = true;
if ( ! empty( $qv['robots'] ) ) {
$this->is_robots = true;
} elseif ( ! empty( $qv['favicon'] ) ) {
$this->is_favicon = true;
}
if ( ! is_scalar( $qv['p'] ) || (int) $qv['p'] < 0 ) {
$qv['p'] = 0;
$qv['error'] = '404';
} else {
$qv['p'] = (int) $qv['p'];
}
$qv['page_id'] = is_scalar( $qv['page_id'] ) ? absint( $qv['page_id'] ) : 0;
$qv['year'] = is_scalar( $qv['year'] ) ? absint( $qv['year'] ) : 0;
$qv['monthnum'] = is_scalar( $qv['monthnum'] ) ? absint( $qv['monthnum'] ) : 0;
$qv['day'] = is_scalar( $qv['day'] ) ? absint( $qv['day'] ) : 0;
$qv['w'] = is_scalar( $qv['w'] ) ? absint( $qv['w'] ) : 0;
$qv['m'] = is_scalar( $qv['m'] ) ? preg_replace( '|[^0-9]|', '', $qv['m'] ) : '';
$qv['paged'] = is_scalar( $qv['paged'] ) ? absint( $qv['paged'] ) : 0;
$qv['cat'] = preg_replace( '|[^0-9,-]|', '', $qv['cat'] ); // Array or comma-separated list of positive or negative integers.
$qv['author'] = is_scalar( $qv['author'] ) ? preg_replace( '|[^0-9,-]|', '', $qv['author'] ) : ''; // Comma-separated list of positive or negative integers.
$qv['pagename'] = is_scalar( $qv['pagename'] ) ? trim( $qv['pagename'] ) : '';
$qv['name'] = is_scalar( $qv['name'] ) ? trim( $qv['name'] ) : '';
$qv['title'] = is_scalar( $qv['title'] ) ? trim( $qv['title'] ) : '';
if ( is_scalar( $qv['hour'] ) && '' !== $qv['hour'] ) {
$qv['hour'] = absint( $qv['hour'] );
} else {
$qv['hour'] = '';
}
if ( is_scalar( $qv['minute'] ) && '' !== $qv['minute'] ) {
$qv['minute'] = absint( $qv['minute'] );
} else {
$qv['minute'] = '';
}
if ( is_scalar( $qv['second'] ) && '' !== $qv['second'] ) {
$qv['second'] = absint( $qv['second'] );
} else {
$qv['second'] = '';
}
if ( is_scalar( $qv['menu_order'] ) && '' !== $qv['menu_order'] ) {
$qv['menu_order'] = absint( $qv['menu_order'] );
} else {
$qv['menu_order'] = '';
}
// Fairly large, potentially too large, upper bound for search string lengths.
if ( ! is_scalar( $qv['s'] ) || ( ! empty( $qv['s'] ) && strlen( $qv['s'] ) > 1600 ) ) {
$qv['s'] = '';
}
// Compat. Map subpost to attachment.
if ( is_scalar( $qv['subpost'] ) && '' != $qv['subpost'] ) {
$qv['attachment'] = $qv['subpost'];
}
if ( is_scalar( $qv['subpost_id'] ) && '' != $qv['subpost_id'] ) {
$qv['attachment_id'] = $qv['subpost_id'];
}
$qv['attachment_id'] = is_scalar( $qv['attachment_id'] ) ? absint( $qv['attachment_id'] ) : 0;
if ( ( '' !== $qv['attachment'] ) || ! empty( $qv['attachment_id'] ) ) {
$this->is_single = true;
$this->is_attachment = true;
} elseif ( '' !== $qv['name'] ) {
$this->is_single = true;
} elseif ( $qv['p'] ) {
$this->is_single = true;
} elseif ( '' !== $qv['pagename'] || ! empty( $qv['page_id'] ) ) {
$this->is_page = true;
$this->is_single = false;
} else {
// Look for archive queries. Dates, categories, authors, search, post type archives.
if ( isset( $this->query['s'] ) ) {
$this->is_search = true;
}
if ( '' !== $qv['second'] ) {
$this->is_time = true;
$this->is_date = true;
}
if ( '' !== $qv['minute'] ) {
$this->is_time = true;
$this->is_date = true;
}
if ( '' !== $qv['hour'] ) {
$this->is_time = true;
$this->is_date = true;
}
if ( $qv['day'] ) {
if ( ! $this->is_date ) {
$date = sprintf( '%04d-%02d-%02d', $qv['year'], $qv['monthnum'], $qv['day'] );
if ( $qv['monthnum'] && $qv['year'] && ! wp_checkdate( $qv['monthnum'], $qv['day'], $qv['year'], $date ) ) {
$qv['error'] = '404';
} else {
$this->is_day = true;
$this->is_date = true;
}
}
}
if ( $qv['monthnum'] ) {
if ( ! $this->is_date ) {
if ( 12 < $qv['monthnum'] ) {
$qv['error'] = '404';
} else {
$this->is_month = true;
$this->is_date = true;
}
}
}
if ( $qv['year'] ) {
if ( ! $this->is_date ) {
$this->is_year = true;
$this->is_date = true;
}
}
if ( $qv['m'] ) {
$this->is_date = true;
if ( strlen( $qv['m'] ) > 9 ) {
$this->is_time = true;
} elseif ( strlen( $qv['m'] ) > 7 ) {
$this->is_day = true;
} elseif ( strlen( $qv['m'] ) > 5 ) {
$this->is_month = true;
} else {
$this->is_year = true;
}
}
if ( $qv['w'] ) {
$this->is_date = true;
}
$this->query_vars_hash = false;
$this->parse_tax_query( $qv );
foreach ( $this->tax_query->queries as $tax_query ) {
if ( ! is_array( $tax_query ) ) {
continue;
}
if ( isset( $tax_query['operator'] ) && 'NOT IN' !== $tax_query['operator'] ) {
switch ( $tax_query['taxonomy'] ) {
case 'category':
$this->is_category = true;
break;
case 'post_tag':
$this->is_tag = true;
break;
default:
$this->is_tax = true;
}
}
}
unset( $tax_query );
if ( empty( $qv['author'] ) || ( '0' == $qv['author'] ) ) {
$this->is_author = false;
} else {
$this->is_author = true;
}
if ( '' !== $qv['author_name'] ) {
$this->is_author = true;
}
if ( ! empty( $qv['post_type'] ) && ! is_array( $qv['post_type'] ) ) {
$post_type_obj = get_post_type_object( $qv['post_type'] );
if ( ! empty( $post_type_obj->has_archive ) ) {
$this->is_post_type_archive = true;
}
}
if ( $this->is_post_type_archive || $this->is_date || $this->is_author || $this->is_category || $this->is_tag || $this->is_tax ) {
$this->is_archive = true;
}
}
if ( '' != $qv['feed'] ) {
$this->is_feed = true;
}
if ( '' != $qv['embed'] ) {
$this->is_embed = true;
}
if ( '' != $qv['tb'] ) {
$this->is_trackback = true;
}
if ( '' != $qv['paged'] && ( (int) $qv['paged'] > 1 ) ) {
$this->is_paged = true;
}
// If we're previewing inside the write screen.
if ( '' != $qv['preview'] ) {
$this->is_preview = true;
}
if ( is_admin() ) {
$this->is_admin = true;
}
if ( str_contains( $qv['feed'], 'comments-' ) ) {
$qv['feed'] = str_replace( 'comments-', '', $qv['feed'] );
$qv['withcomments'] = 1;
}
$this->is_singular = $this->is_single || $this->is_page || $this->is_attachment;
if ( $this->is_feed && ( ! empty( $qv['withcomments'] ) || ( empty( $qv['withoutcomments'] ) && $this->is_singular ) ) ) {
$this->is_comment_feed = true;
}
if ( ! ( $this->is_singular || $this->is_archive || $this->is_search || $this->is_feed
|| ( wp_is_serving_rest_request() && $this->is_main_query() )
|| $this->is_trackback || $this->is_404 || $this->is_admin || $this->is_robots || $this->is_favicon ) ) {
$this->is_home = true;
}
// Correct `is_*` for 'page_on_front' and 'page_for_posts'.
if ( $this->is_home && 'page' === get_option( 'show_on_front' ) && get_option( 'page_on_front' ) ) {
$_query = wp_parse_args( $this->query );
// 'pagename' can be set and empty depending on matched rewrite rules. Ignore an empty 'pagename'.
if ( isset( $_query['pagename'] ) && '' === $_query['pagename'] ) {
unset( $_query['pagename'] );
}
unset( $_query['embed'] );
if ( empty( $_query ) || ! array_diff( array_keys( $_query ), array( 'preview', 'page', 'paged', 'cpage' ) ) ) {
$this->is_page = true;
$this->is_home = false;
$qv['page_id'] = get_option( 'page_on_front' );
// Correct for 'page_on_front'.
if ( ! empty( $qv['paged'] ) ) {
$qv['page'] = $qv['paged'];
unset( $qv['paged'] );
}
}
}
if ( '' !== $qv['pagename'] ) {
$this->queried_object = get_page_by_path( $qv['pagename'] );
if ( $this->queried_object && 'attachment' === $this->queried_object->post_type ) {
if ( preg_match( '/^[^%]*%(?:postname)%/', get_option( 'permalink_structure' ) ) ) {
// See if we also have a post with the same slug.
$post = get_page_by_path( $qv['pagename'], OBJECT, 'post' );
if ( $post ) {
$this->queried_object = $post;
$this->is_page = false;
$this->is_single = true;
}
}
}
if ( ! empty( $this->queried_object ) ) {
$this->queried_object_id = (int) $this->queried_object->ID;
} else {
unset( $this->queried_object );
}
if ( 'page' === get_option( 'show_on_front' ) && isset( $this->queried_object_id ) && get_option( 'page_for_posts' ) == $this->queried_object_id ) {
$this->is_page = false;
$this->is_home = true;
$this->is_posts_page = true;
}
if ( isset( $this->queried_object_id ) && get_option( 'wp_page_for_privacy_policy' ) == $this->queried_object_id ) {
$this->is_privacy_policy = true;
}
}
if ( $qv['page_id'] ) {
if ( 'page' === get_option( 'show_on_front' ) && get_option( 'page_for_posts' ) == $qv['page_id'] ) {
$this->is_page = false;
$this->is_home = true;
$this->is_posts_page = true;
}
if ( get_option( 'wp_page_for_privacy_policy' ) == $qv['page_id'] ) {
$this->is_privacy_policy = true;
}
}
if ( ! empty( $qv['post_type'] ) ) {
if ( is_array( $qv['post_type'] ) ) {
$qv['post_type'] = array_map( 'sanitize_key', $qv['post_type'] );
} else {
$qv['post_type'] = sanitize_key( $qv['post_type'] );
}
}
if ( ! empty( $qv['post_status'] ) ) {
if ( is_array( $qv['post_status'] ) ) {
$qv['post_status'] = array_map( 'sanitize_key', $qv['post_status'] );
} else {
$qv['post_status'] = preg_replace( '|[^a-z0-9_,-]|', '', $qv['post_status'] );
}
}
if ( $this->is_posts_page && ( ! isset( $qv['withcomments'] ) || ! $qv['withcomments'] ) ) {
$this->is_comment_feed = false;
}
$this->is_singular = $this->is_single || $this->is_page || $this->is_attachment;
// Done correcting `is_*` for 'page_on_front' and 'page_for_posts'.
if ( '404' == $qv['error'] ) {
$this->set_404();
}
$this->is_embed = $this->is_embed && ( $this->is_singular || $this->is_404 );
$this->query_vars_hash = md5( serialize( $this->query_vars ) );
$this->query_vars_changed = false;
/**
* Fires after the main query vars have been parsed.
*
* @since 1.5.0
*
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
do_action_ref_array( 'parse_query', array( &$this ) );
}
/**
* Parses various taxonomy related query vars.
*
* For BC, this method is not marked as protected. See [28987].
*
* @since 3.1.0
*
* @param array $q The query variables. Passed by reference.
*/
public function parse_tax_query( &$q ) {
if ( ! empty( $q['tax_query'] ) && is_array( $q['tax_query'] ) ) {
$tax_query = $q['tax_query'];
} else {
$tax_query = array();
}
if ( ! empty( $q['taxonomy'] ) && ! empty( $q['term'] ) ) {
$tax_query[] = array(
'taxonomy' => $q['taxonomy'],
'terms' => array( $q['term'] ),
'field' => 'slug',
);
}
foreach ( get_taxonomies( array(), 'objects' ) as $taxonomy => $t ) {
if ( 'post_tag' === $taxonomy ) {
continue; // Handled further down in the $q['tag'] block.
}
if ( $t->query_var && ! empty( $q[ $t->query_var ] ) ) {
$tax_query_defaults = array(
'taxonomy' => $taxonomy,
'field' => 'slug',
);
if ( ! empty( $t->rewrite['hierarchical'] ) ) {
$q[ $t->query_var ] = wp_basename( $q[ $t->query_var ] );
}
$term = $q[ $t->query_var ];
if ( is_array( $term ) ) {
$term = implode( ',', $term );
}
if ( str_contains( $term, '+' ) ) {
$terms = preg_split( '/[+]+/', $term );
foreach ( $terms as $term ) {
$tax_query[] = array_merge(
$tax_query_defaults,
array(
'terms' => array( $term ),
)
);
}
} else {
$tax_query[] = array_merge(
$tax_query_defaults,
array(
'terms' => preg_split( '/[,]+/', $term ),
)
);
}
}
}
// If query string 'cat' is an array, implode it.
if ( is_array( $q['cat'] ) ) {
$q['cat'] = implode( ',', $q['cat'] );
}
// Category stuff.
if ( ! empty( $q['cat'] ) && ! $this->is_singular ) {
$cat_in = array();
$cat_not_in = array();
$cat_array = preg_split( '/[,\s]+/', urldecode( $q['cat'] ) );
$cat_array = array_map( 'intval', $cat_array );
$q['cat'] = implode( ',', $cat_array );
foreach ( $cat_array as $cat ) {
if ( $cat > 0 ) {
$cat_in[] = $cat;
} elseif ( $cat < 0 ) {
$cat_not_in[] = abs( $cat );
}
}
if ( ! empty( $cat_in ) ) {
$tax_query[] = array(
'taxonomy' => 'category',
'terms' => $cat_in,
'field' => 'term_id',
'include_children' => true,
);
}
if ( ! empty( $cat_not_in ) ) {
$tax_query[] = array(
'taxonomy' => 'category',
'terms' => $cat_not_in,
'field' => 'term_id',
'operator' => 'NOT IN',
'include_children' => true,
);
}
unset( $cat_array, $cat_in, $cat_not_in );
}
if ( ! empty( $q['category__and'] ) && 1 === count( (array) $q['category__and'] ) ) {
$q['category__and'] = (array) $q['category__and'];
if ( ! isset( $q['category__in'] ) ) {
$q['category__in'] = array();
}
$q['category__in'][] = absint( reset( $q['category__and'] ) );
unset( $q['category__and'] );
}
if ( ! empty( $q['category__in'] ) ) {
$q['category__in'] = array_map( 'absint', array_unique( (array) $q['category__in'] ) );
$tax_query[] = array(
'taxonomy' => 'category',
'terms' => $q['category__in'],
'field' => 'term_id',
'include_children' => false,
);
}
if ( ! empty( $q['category__not_in'] ) ) {
$q['category__not_in'] = array_map( 'absint', array_unique( (array) $q['category__not_in'] ) );
$tax_query[] = array(
'taxonomy' => 'category',
'terms' => $q['category__not_in'],
'operator' => 'NOT IN',
'include_children' => false,
);
}
if ( ! empty( $q['category__and'] ) ) {
$q['category__and'] = array_map( 'absint', array_unique( (array) $q['category__and'] ) );
$tax_query[] = array(
'taxonomy' => 'category',
'terms' => $q['category__and'],
'field' => 'term_id',
'operator' => 'AND',
'include_children' => false,
);
}
// If query string 'tag' is array, implode it.
if ( is_array( $q['tag'] ) ) {
$q['tag'] = implode( ',', $q['tag'] );
}
// Tag stuff.
if ( '' !== $q['tag'] && ! $this->is_singular && $this->query_vars_changed ) {
if ( str_contains( $q['tag'], ',' ) ) {
$tags = preg_split( '/[,\r\n\t ]+/', $q['tag'] );
foreach ( (array) $tags as $tag ) {
$tag = sanitize_term_field( 'slug', $tag, 0, 'post_tag', 'db' );
$q['tag_slug__in'][] = $tag;
}
} elseif ( preg_match( '/[+\r\n\t ]+/', $q['tag'] ) || ! empty( $q['cat'] ) ) {
$tags = preg_split( '/[+\r\n\t ]+/', $q['tag'] );
foreach ( (array) $tags as $tag ) {
$tag = sanitize_term_field( 'slug', $tag, 0, 'post_tag', 'db' );
$q['tag_slug__and'][] = $tag;
}
} else {
$q['tag'] = sanitize_term_field( 'slug', $q['tag'], 0, 'post_tag', 'db' );
$q['tag_slug__in'][] = $q['tag'];
}
}
if ( ! empty( $q['tag_id'] ) ) {
$q['tag_id'] = absint( $q['tag_id'] );
$tax_query[] = array(
'taxonomy' => 'post_tag',
'terms' => $q['tag_id'],
);
}
if ( ! empty( $q['tag__in'] ) ) {
$q['tag__in'] = array_map( 'absint', array_unique( (array) $q['tag__in'] ) );
$tax_query[] = array(
'taxonomy' => 'post_tag',
'terms' => $q['tag__in'],
);
}
if ( ! empty( $q['tag__not_in'] ) ) {
$q['tag__not_in'] = array_map( 'absint', array_unique( (array) $q['tag__not_in'] ) );
$tax_query[] = array(
'taxonomy' => 'post_tag',
'terms' => $q['tag__not_in'],
'operator' => 'NOT IN',
);
}
if ( ! empty( $q['tag__and'] ) ) {
$q['tag__and'] = array_map( 'absint', array_unique( (array) $q['tag__and'] ) );
$tax_query[] = array(
'taxonomy' => 'post_tag',
'terms' => $q['tag__and'],
'operator' => 'AND',
);
}
if ( ! empty( $q['tag_slug__in'] ) ) {
$q['tag_slug__in'] = array_map( 'sanitize_title_for_query', array_unique( (array) $q['tag_slug__in'] ) );
$tax_query[] = array(
'taxonomy' => 'post_tag',
'terms' => $q['tag_slug__in'],
'field' => 'slug',
);
}
if ( ! empty( $q['tag_slug__and'] ) ) {
$q['tag_slug__and'] = array_map( 'sanitize_title_for_query', array_unique( (array) $q['tag_slug__and'] ) );
$tax_query[] = array(
'taxonomy' => 'post_tag',
'terms' => $q['tag_slug__and'],
'field' => 'slug',
'operator' => 'AND',
);
}
$this->tax_query = new WP_Tax_Query( $tax_query );
/**
* Fires after taxonomy-related query vars have been parsed.
*
* @since 3.7.0
*
* @param WP_Query $query The WP_Query instance.
*/
do_action( 'parse_tax_query', $this );
}
/**
* Generates SQL for the WHERE clause based on passed search terms.
*
* @since 3.7.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @param array $q Query variables.
* @return string WHERE clause.
*/
protected function parse_search( &$q ) {
global $wpdb;
$search = '';
// Added slashes screw with quote grouping when done early, so done later.
$q['s'] = stripslashes( $q['s'] );
if ( empty( $_GET['s'] ) && $this->is_main_query() ) {
$q['s'] = urldecode( $q['s'] );
}
// There are no line breaks in fields.
$q['s'] = str_replace( array( "\r", "\n" ), '', $q['s'] );
$q['search_terms_count'] = 1;
if ( ! empty( $q['sentence'] ) ) {
$q['search_terms'] = array( $q['s'] );
} else {
if ( preg_match_all( '/".*?("|$)|((?<=[\t ",+])|^)[^\t ",+]+/', $q['s'], $matches ) ) {
$q['search_terms_count'] = count( $matches[0] );
$q['search_terms'] = $this->parse_search_terms( $matches[0] );
// If the search string has only short terms or stopwords, or is 10+ terms long, match it as sentence.
if ( empty( $q['search_terms'] ) || count( $q['search_terms'] ) > 9 ) {
$q['search_terms'] = array( $q['s'] );
}
} else {
$q['search_terms'] = array( $q['s'] );
}
}
$n = ! empty( $q['exact'] ) ? '' : '%';
$searchand = '';
$q['search_orderby_title'] = array();
$default_search_columns = array( 'post_title', 'post_excerpt', 'post_content' );
$search_columns = ! empty( $q['search_columns'] ) ? $q['search_columns'] : $default_search_columns;
if ( ! is_array( $search_columns ) ) {
$search_columns = array( $search_columns );
}
/**
* Filters the columns to search in a WP_Query search.
*
* The supported columns are `post_title`, `post_excerpt` and `post_content`.
* They are all included by default.
*
* @since 6.2.0
*
* @param string[] $search_columns Array of column names to be searched.
* @param string $search Text being searched.
* @param WP_Query $query The current WP_Query instance.
*/
$search_columns = (array) apply_filters( 'post_search_columns', $search_columns, $q['s'], $this );
// Use only supported search columns.
$search_columns = array_intersect( $search_columns, $default_search_columns );
if ( empty( $search_columns ) ) {
$search_columns = $default_search_columns;
}
/**
* Filters the prefix that indicates that a search term should be excluded from results.
*
* @since 4.7.0
*
* @param string $exclusion_prefix The prefix. Default '-'. Returning
* an empty value disables exclusions.
*/
$exclusion_prefix = apply_filters( 'wp_query_search_exclusion_prefix', '-' );
foreach ( $q['search_terms'] as $term ) {
// If there is an $exclusion_prefix, terms prefixed with it should be excluded.
$exclude = $exclusion_prefix && str_starts_with( $term, $exclusion_prefix );
if ( $exclude ) {
$like_op = 'NOT LIKE';
$andor_op = 'AND';
$term = substr( $term, 1 );
} else {
$like_op = 'LIKE';
$andor_op = 'OR';
}
if ( $n && ! $exclude ) {
$like = '%' . $wpdb->esc_like( $term ) . '%';
$q['search_orderby_title'][] = $wpdb->prepare( "{$wpdb->posts}.post_title LIKE %s", $like );
}
$like = $n . $wpdb->esc_like( $term ) . $n;
$search_columns_parts = array();
foreach ( $search_columns as $search_column ) {
$search_columns_parts[ $search_column ] = $wpdb->prepare( "({$wpdb->posts}.$search_column $like_op %s)", $like );
}
if ( ! empty( $this->allow_query_attachment_by_filename ) ) {
$search_columns_parts['attachment'] = $wpdb->prepare( "(sq1.meta_value $like_op %s)", $like );
}
$search .= "$searchand(" . implode( " $andor_op ", $search_columns_parts ) . ')';
$searchand = ' AND ';
}
if ( ! empty( $search ) ) {
$search = " AND ({$search}) ";
if ( ! is_user_logged_in() ) {
$search .= " AND ({$wpdb->posts}.post_password = '') ";
}
}
return $search;
}
/**
* Checks if the terms are suitable for searching.
*
* Uses an array of stopwords (terms) that are excluded from the separate
* term matching when searching for posts. The list of English stopwords is
* the approximate search engines list, and is translatable.
*
* @since 3.7.0
*
* @param string[] $terms Array of terms to check.
* @return string[] Terms that are not stopwords.
*/
protected function parse_search_terms( $terms ) {
$strtolower = function_exists( 'mb_strtolower' ) ? 'mb_strtolower' : 'strtolower';
$checked = array();
$stopwords = $this->get_search_stopwords();
foreach ( $terms as $term ) {
// Keep before/after spaces when term is for exact match.
if ( preg_match( '/^".+"$/', $term ) ) {
$term = trim( $term, "\"'" );
} else {
$term = trim( $term, "\"' " );
}
// Avoid single A-Z and single dashes.
if ( ! $term || ( 1 === strlen( $term ) && preg_match( '/^[a-z\-]$/i', $term ) ) ) {
continue;
}
if ( in_array( call_user_func( $strtolower, $term ), $stopwords, true ) ) {
continue;
}
$checked[] = $term;
}
return $checked;
}
/**
* Retrieves stopwords used when parsing search terms.
*
* @since 3.7.0
*
* @return string[] Stopwords.
*/
protected function get_search_stopwords() {
if ( isset( $this->stopwords ) ) {
return $this->stopwords;
}
/*
* translators: This is a comma-separated list of very common words that should be excluded from a search,
* like a, an, and the. These are usually called "stopwords". You should not simply translate these individual
* words into your language. Instead, look for and provide commonly accepted stopwords in your language.
*/
$words = explode(
',',
_x(
'about,an,are,as,at,be,by,com,for,from,how,in,is,it,of,on,or,that,the,this,to,was,what,when,where,who,will,with,www',
'Comma-separated list of search stopwords in your language'
)
);
$stopwords = array();
foreach ( $words as $word ) {
$word = trim( $word, "\r\n\t " );
if ( $word ) {
$stopwords[] = $word;
}
}
/**
* Filters stopwords used when parsing search terms.
*
* @since 3.7.0
*
* @param string[] $stopwords Array of stopwords.
*/
$this->stopwords = apply_filters( 'wp_search_stopwords', $stopwords );
return $this->stopwords;
}
/**
* Generates SQL for the ORDER BY condition based on passed search terms.
*
* @since 3.7.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @param array $q Query variables.
* @return string ORDER BY clause.
*/
protected function parse_search_order( &$q ) {
global $wpdb;
if ( $q['search_terms_count'] > 1 ) {
$num_terms = count( $q['search_orderby_title'] );
// If the search terms contain negative queries, don't bother ordering by sentence matches.
$like = '';
if ( ! preg_match( '/(?:\s|^)\-/', $q['s'] ) ) {
$like = '%' . $wpdb->esc_like( $q['s'] ) . '%';
}
$search_orderby = '';
// Sentence match in 'post_title'.
if ( $like ) {
$search_orderby .= $wpdb->prepare( "WHEN {$wpdb->posts}.post_title LIKE %s THEN 1 ", $like );
}
/*
* Sanity limit, sort as sentence when more than 6 terms
* (few searches are longer than 6 terms and most titles are not).
*/
if ( $num_terms < 7 ) {
// All words in title.
$search_orderby .= 'WHEN ' . implode( ' AND ', $q['search_orderby_title'] ) . ' THEN 2 ';
// Any word in title, not needed when $num_terms == 1.
if ( $num_terms > 1 ) {
$search_orderby .= 'WHEN ' . implode( ' OR ', $q['search_orderby_title'] ) . ' THEN 3 ';
}
}
// Sentence match in 'post_content' and 'post_excerpt'.
if ( $like ) {
$search_orderby .= $wpdb->prepare( "WHEN {$wpdb->posts}.post_excerpt LIKE %s THEN 4 ", $like );
$search_orderby .= $wpdb->prepare( "WHEN {$wpdb->posts}.post_content LIKE %s THEN 5 ", $like );
}
if ( $search_orderby ) {
$search_orderby = '(CASE ' . $search_orderby . 'ELSE 6 END)';
}
} else {
// Single word or sentence search.
$search_orderby = reset( $q['search_orderby_title'] ) . ' DESC';
}
return $search_orderby;
}
/**
* Converts the given orderby alias (if allowed) to a properly-prefixed value.
*
* @since 4.0.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @param string $orderby Alias for the field to order by.
* @return string|false Table-prefixed value to used in the ORDER clause. False otherwise.
*/
protected function parse_orderby( $orderby ) {
global $wpdb;
// Used to filter values.
$allowed_keys = array(
'post_name',
'post_author',
'post_date',
'post_title',
'post_modified',
'post_parent',
'post_type',
'name',
'author',
'date',
'title',
'modified',
'parent',
'type',
'ID',
'menu_order',
'comment_count',
'rand',
'post__in',
'post_parent__in',
'post_name__in',
);
$primary_meta_key = '';
$primary_meta_query = false;
$meta_clauses = $this->meta_query->get_clauses();
if ( ! empty( $meta_clauses ) ) {
$primary_meta_query = reset( $meta_clauses );
if ( ! empty( $primary_meta_query['key'] ) ) {
$primary_meta_key = $primary_meta_query['key'];
$allowed_keys[] = $primary_meta_key;
}
$allowed_keys[] = 'meta_value';
$allowed_keys[] = 'meta_value_num';
$allowed_keys = array_merge( $allowed_keys, array_keys( $meta_clauses ) );
}
// If RAND() contains a seed value, sanitize and add to allowed keys.
$rand_with_seed = false;
if ( preg_match( '/RAND\(([0-9]+)\)/i', $orderby, $matches ) ) {
$orderby = sprintf( 'RAND(%s)', (int) $matches[1] );
$allowed_keys[] = $orderby;
$rand_with_seed = true;
}
if ( ! in_array( $orderby, $allowed_keys, true ) ) {
return false;
}
$orderby_clause = '';
switch ( $orderby ) {
case 'post_name':
case 'post_author':
case 'post_date':
case 'post_title':
case 'post_modified':
case 'post_parent':
case 'post_type':
case 'ID':
case 'menu_order':
case 'comment_count':
$orderby_clause = "{$wpdb->posts}.{$orderby}";
break;
case 'rand':
$orderby_clause = 'RAND()';
break;
case $primary_meta_key:
case 'meta_value':
if ( ! empty( $primary_meta_query['type'] ) ) {
$orderby_clause = "CAST({$primary_meta_query['alias']}.meta_value AS {$primary_meta_query['cast']})";
} else {
$orderby_clause = "{$primary_meta_query['alias']}.meta_value";
}
break;
case 'meta_value_num':
$orderby_clause = "{$primary_meta_query['alias']}.meta_value+0";
break;
case 'post__in':
if ( ! empty( $this->query_vars['post__in'] ) ) {
$orderby_clause = "FIELD({$wpdb->posts}.ID," . implode( ',', array_map( 'absint', $this->query_vars['post__in'] ) ) . ')';
}
break;
case 'post_parent__in':
if ( ! empty( $this->query_vars['post_parent__in'] ) ) {
$orderby_clause = "FIELD( {$wpdb->posts}.post_parent," . implode( ', ', array_map( 'absint', $this->query_vars['post_parent__in'] ) ) . ' )';
}
break;
case 'post_name__in':
if ( ! empty( $this->query_vars['post_name__in'] ) ) {
$post_name__in = array_map( 'sanitize_title_for_query', $this->query_vars['post_name__in'] );
$post_name__in_string = "'" . implode( "','", $post_name__in ) . "'";
$orderby_clause = "FIELD( {$wpdb->posts}.post_name," . $post_name__in_string . ' )';
}
break;
default:
if ( array_key_exists( $orderby, $meta_clauses ) ) {
// $orderby corresponds to a meta_query clause.
$meta_clause = $meta_clauses[ $orderby ];
$orderby_clause = "CAST({$meta_clause['alias']}.meta_value AS {$meta_clause['cast']})";
} elseif ( $rand_with_seed ) {
$orderby_clause = $orderby;
} else {
// Default: order by post field.
$orderby_clause = "{$wpdb->posts}.post_" . sanitize_key( $orderby );
}
break;
}
return $orderby_clause;
}
/**
* Parse an 'order' query variable and cast it to ASC or DESC as necessary.
*
* @since 4.0.0
*
* @param string $order The 'order' query variable.
* @return string The sanitized 'order' query variable.
*/
protected function parse_order( $order ) {
if ( ! is_string( $order ) || empty( $order ) ) {
return 'DESC';
}
if ( 'ASC' === strtoupper( $order ) ) {
return 'ASC';
} else {
return 'DESC';
}
}
/**
* Sets the 404 property and saves whether query is feed.
*
* @since 2.0.0
*/
public function set_404() {
$is_feed = $this->is_feed;
$this->init_query_flags();
$this->is_404 = true;
$this->is_feed = $is_feed;
/**
* Fires after a 404 is triggered.
*
* @since 5.5.0
*
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
do_action_ref_array( 'set_404', array( $this ) );
}
/**
* Retrieves the value of a query variable.
*
* @since 1.5.0
* @since 3.9.0 The `$default_value` argument was introduced.
*
* @param string $query_var Query variable key.
* @param mixed $default_value Optional. Value to return if the query variable is not set.
* Default empty string.
* @return mixed Contents of the query variable.
*/
public function get( $query_var, $default_value = '' ) {
if ( isset( $this->query_vars[ $query_var ] ) ) {
return $this->query_vars[ $query_var ];
}
return $default_value;
}
/**
* Sets the value of a query variable.
*
* @since 1.5.0
*
* @param string $query_var Query variable key.
* @param mixed $value Query variable value.
*/
public function set( $query_var, $value ) {
$this->query_vars[ $query_var ] = $value;
}
/**
* Retrieves an array of posts based on query variables.
*
* There are a few filters and actions that can be used to modify the post
* database query.
*
* @since 1.5.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @return WP_Post[]|int[] Array of post objects or post IDs.
*/
public function get_posts() {
global $wpdb;
$this->parse_query();
/**
* Fires after the query variable object is created, but before the actual query is run.
*
* Note: If using conditional tags, use the method versions within the passed instance
* (e.g. $this->is_main_query() instead of is_main_query()). This is because the functions
* like is_main_query() test against the global $wp_query instance, not the passed one.
*
* @since 2.0.0
*
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
do_action_ref_array( 'pre_get_posts', array( &$this ) );
// Shorthand.
$q = &$this->query_vars;
// Fill again in case 'pre_get_posts' unset some vars.
$q = $this->fill_query_vars( $q );
/**
* Filters whether an attachment query should include filenames or not.
*
* @since 6.0.3
*
* @param bool $allow_query_attachment_by_filename Whether or not to include filenames.
*/
$this->allow_query_attachment_by_filename = apply_filters( 'wp_allow_query_attachment_by_filename', false );
remove_all_filters( 'wp_allow_query_attachment_by_filename' );
// Parse meta query.
$this->meta_query = new WP_Meta_Query();
$this->meta_query->parse_query_vars( $q );
// Set a flag if a 'pre_get_posts' hook changed the query vars.
$hash = md5( serialize( $this->query_vars ) );
if ( $hash != $this->query_vars_hash ) {
$this->query_vars_changed = true;
$this->query_vars_hash = $hash;
}
unset( $hash );
// First let's clear some variables.
$distinct = '';
$whichauthor = '';
$whichmimetype = '';
$where = '';
$limits = '';
$join = '';
$search = '';
$groupby = '';
$post_status_join = false;
$page = 1;
if ( isset( $q['caller_get_posts'] ) ) {
_deprecated_argument(
'WP_Query',
'3.1.0',
sprintf(
/* translators: 1: caller_get_posts, 2: ignore_sticky_posts */
__( '%1$s is deprecated. Use %2$s instead.' ),
'caller_get_posts',
'ignore_sticky_posts'
)
);
if ( ! isset( $q['ignore_sticky_posts'] ) ) {
$q['ignore_sticky_posts'] = $q['caller_get_posts'];
}
}
if ( ! isset( $q['ignore_sticky_posts'] ) ) {
$q['ignore_sticky_posts'] = false;
}
if ( ! isset( $q['suppress_filters'] ) ) {
$q['suppress_filters'] = false;
}
if ( ! isset( $q['cache_results'] ) ) {
$q['cache_results'] = true;
}
if ( ! isset( $q['update_post_term_cache'] ) ) {
$q['update_post_term_cache'] = true;
}
if ( ! isset( $q['update_menu_item_cache'] ) ) {
$q['update_menu_item_cache'] = false;
}
if ( ! isset( $q['lazy_load_term_meta'] ) ) {
$q['lazy_load_term_meta'] = $q['update_post_term_cache'];
} elseif ( $q['lazy_load_term_meta'] ) { // Lazy loading term meta only works if term caches are primed.
$q['update_post_term_cache'] = true;
}
if ( ! isset( $q['update_post_meta_cache'] ) ) {
$q['update_post_meta_cache'] = true;
}
if ( ! isset( $q['post_type'] ) ) {
if ( $this->is_search ) {
$q['post_type'] = 'any';
} else {
$q['post_type'] = '';
}
}
$post_type = $q['post_type'];
if ( empty( $q['posts_per_page'] ) ) {
$q['posts_per_page'] = get_option( 'posts_per_page' );
}
if ( isset( $q['showposts'] ) && $q['showposts'] ) {
$q['showposts'] = (int) $q['showposts'];
$q['posts_per_page'] = $q['showposts'];
}
if ( ( isset( $q['posts_per_archive_page'] ) && 0 != $q['posts_per_archive_page'] ) && ( $this->is_archive || $this->is_search ) ) {
$q['posts_per_page'] = $q['posts_per_archive_page'];
}
if ( ! isset( $q['nopaging'] ) ) {
if ( -1 == $q['posts_per_page'] ) {
$q['nopaging'] = true;
} else {
$q['nopaging'] = false;
}
}
if ( $this->is_feed ) {
// This overrides 'posts_per_page'.
if ( ! empty( $q['posts_per_rss'] ) ) {
$q['posts_per_page'] = $q['posts_per_rss'];
} else {
$q['posts_per_page'] = get_option( 'posts_per_rss' );
}
$q['nopaging'] = false;
}
$q['posts_per_page'] = (int) $q['posts_per_page'];
if ( $q['posts_per_page'] < -1 ) {
$q['posts_per_page'] = abs( $q['posts_per_page'] );
} elseif ( 0 == $q['posts_per_page'] ) {
$q['posts_per_page'] = 1;
}
if ( ! isset( $q['comments_per_page'] ) || 0 == $q['comments_per_page'] ) {
$q['comments_per_page'] = get_option( 'comments_per_page' );
}
if ( $this->is_home && ( empty( $this->query ) || 'true' === $q['preview'] ) && ( 'page' === get_option( 'show_on_front' ) ) && get_option( 'page_on_front' ) ) {
$this->is_page = true;
$this->is_home = false;
$q['page_id'] = get_option( 'page_on_front' );
}
if ( isset( $q['page'] ) ) {
$q['page'] = is_scalar( $q['page'] ) ? absint( trim( $q['page'], '/' ) ) : 0;
}
// If true, forcibly turns off SQL_CALC_FOUND_ROWS even when limits are present.
if ( isset( $q['no_found_rows'] ) ) {
$q['no_found_rows'] = (bool) $q['no_found_rows'];
} else {
$q['no_found_rows'] = false;
}
switch ( $q['fields'] ) {
case 'ids':
$fields = "{$wpdb->posts}.ID";
break;
case 'id=>parent':
$fields = "{$wpdb->posts}.ID, {$wpdb->posts}.post_parent";
break;
default:
$fields = "{$wpdb->posts}.*";
}
if ( '' !== $q['menu_order'] ) {
$where .= " AND {$wpdb->posts}.menu_order = " . $q['menu_order'];
}
// The "m" parameter is meant for months but accepts datetimes of varying specificity.
if ( $q['m'] ) {
$where .= " AND YEAR({$wpdb->posts}.post_date)=" . substr( $q['m'], 0, 4 );
if ( strlen( $q['m'] ) > 5 ) {
$where .= " AND MONTH({$wpdb->posts}.post_date)=" . substr( $q['m'], 4, 2 );
}
if ( strlen( $q['m'] ) > 7 ) {
$where .= " AND DAYOFMONTH({$wpdb->posts}.post_date)=" . substr( $q['m'], 6, 2 );
}
if ( strlen( $q['m'] ) > 9 ) {
$where .= " AND HOUR({$wpdb->posts}.post_date)=" . substr( $q['m'], 8, 2 );
}
if ( strlen( $q['m'] ) > 11 ) {
$where .= " AND MINUTE({$wpdb->posts}.post_date)=" . substr( $q['m'], 10, 2 );
}
if ( strlen( $q['m'] ) > 13 ) {
$where .= " AND SECOND({$wpdb->posts}.post_date)=" . substr( $q['m'], 12, 2 );
}
}
// Handle the other individual date parameters.
$date_parameters = array();
if ( '' !== $q['hour'] ) {
$date_parameters['hour'] = $q['hour'];
}
if ( '' !== $q['minute'] ) {
$date_parameters['minute'] = $q['minute'];
}
if ( '' !== $q['second'] ) {
$date_parameters['second'] = $q['second'];
}
if ( $q['year'] ) {
$date_parameters['year'] = $q['year'];
}
if ( $q['monthnum'] ) {
$date_parameters['monthnum'] = $q['monthnum'];
}
if ( $q['w'] ) {
$date_parameters['week'] = $q['w'];
}
if ( $q['day'] ) {
$date_parameters['day'] = $q['day'];
}
if ( $date_parameters ) {
$date_query = new WP_Date_Query( array( $date_parameters ) );
$where .= $date_query->get_sql();
}
unset( $date_parameters, $date_query );
// Handle complex date queries.
if ( ! empty( $q['date_query'] ) ) {
$this->date_query = new WP_Date_Query( $q['date_query'] );
$where .= $this->date_query->get_sql();
}
// If we've got a post_type AND it's not "any" post_type.
if ( ! empty( $q['post_type'] ) && 'any' !== $q['post_type'] ) {
foreach ( (array) $q['post_type'] as $_post_type ) {
$ptype_obj = get_post_type_object( $_post_type );
if ( ! $ptype_obj || ! $ptype_obj->query_var || empty( $q[ $ptype_obj->query_var ] ) ) {
continue;
}
if ( ! $ptype_obj->hierarchical ) {
// Non-hierarchical post types can directly use 'name'.
$q['name'] = $q[ $ptype_obj->query_var ];
} else {
// Hierarchical post types will operate through 'pagename'.
$q['pagename'] = $q[ $ptype_obj->query_var ];
$q['name'] = '';
}
// Only one request for a slug is possible, this is why name & pagename are overwritten above.
break;
} // End foreach.
unset( $ptype_obj );
}
if ( '' !== $q['title'] ) {
$where .= $wpdb->prepare( " AND {$wpdb->posts}.post_title = %s", stripslashes( $q['title'] ) );
}
// Parameters related to 'post_name'.
if ( '' !== $q['name'] ) {
$q['name'] = sanitize_title_for_query( $q['name'] );
$where .= " AND {$wpdb->posts}.post_name = '" . $q['name'] . "'";
} elseif ( '' !== $q['pagename'] ) {
if ( isset( $this->queried_object_id ) ) {
$reqpage = $this->queried_object_id;
} else {
if ( 'page' !== $q['post_type'] ) {
foreach ( (array) $q['post_type'] as $_post_type ) {
$ptype_obj = get_post_type_object( $_post_type );
if ( ! $ptype_obj || ! $ptype_obj->hierarchical ) {
continue;
}
$reqpage = get_page_by_path( $q['pagename'], OBJECT, $_post_type );
if ( $reqpage ) {
break;
}
}
unset( $ptype_obj );
} else {
$reqpage = get_page_by_path( $q['pagename'] );
}
if ( ! empty( $reqpage ) ) {
$reqpage = $reqpage->ID;
} else {
$reqpage = 0;
}
}
$page_for_posts = get_option( 'page_for_posts' );
if ( ( 'page' !== get_option( 'show_on_front' ) ) || empty( $page_for_posts ) || ( $reqpage != $page_for_posts ) ) {
$q['pagename'] = sanitize_title_for_query( wp_basename( $q['pagename'] ) );
$q['name'] = $q['pagename'];
$where .= " AND ({$wpdb->posts}.ID = '$reqpage')";
$reqpage_obj = get_post( $reqpage );
if ( is_object( $reqpage_obj ) && 'attachment' === $reqpage_obj->post_type ) {
$this->is_attachment = true;
$post_type = 'attachment';
$q['post_type'] = 'attachment';
$this->is_page = true;
$q['attachment_id'] = $reqpage;
}
}
} elseif ( '' !== $q['attachment'] ) {
$q['attachment'] = sanitize_title_for_query( wp_basename( $q['attachment'] ) );
$q['name'] = $q['attachment'];
$where .= " AND {$wpdb->posts}.post_name = '" . $q['attachment'] . "'";
} elseif ( is_array( $q['post_name__in'] ) && ! empty( $q['post_name__in'] ) ) {
$q['post_name__in'] = array_map( 'sanitize_title_for_query', $q['post_name__in'] );
$post_name__in = "'" . implode( "','", $q['post_name__in'] ) . "'";
$where .= " AND {$wpdb->posts}.post_name IN ($post_name__in)";
}
// If an attachment is requested by number, let it supersede any post number.
if ( $q['attachment_id'] ) {
$q['p'] = absint( $q['attachment_id'] );
}
// If a post number is specified, load that post.
if ( $q['p'] ) {
$where .= " AND {$wpdb->posts}.ID = " . $q['p'];
} elseif ( $q['post__in'] ) {
$post__in = implode( ',', array_map( 'absint', $q['post__in'] ) );
$where .= " AND {$wpdb->posts}.ID IN ($post__in)";
} elseif ( $q['post__not_in'] ) {
$post__not_in = implode( ',', array_map( 'absint', $q['post__not_in'] ) );
$where .= " AND {$wpdb->posts}.ID NOT IN ($post__not_in)";
}
if ( is_numeric( $q['post_parent'] ) ) {
$where .= $wpdb->prepare( " AND {$wpdb->posts}.post_parent = %d ", $q['post_parent'] );
} elseif ( $q['post_parent__in'] ) {
$post_parent__in = implode( ',', array_map( 'absint', $q['post_parent__in'] ) );
$where .= " AND {$wpdb->posts}.post_parent IN ($post_parent__in)";
} elseif ( $q['post_parent__not_in'] ) {
$post_parent__not_in = implode( ',', array_map( 'absint', $q['post_parent__not_in'] ) );
$where .= " AND {$wpdb->posts}.post_parent NOT IN ($post_parent__not_in)";
}
if ( $q['page_id'] ) {
if ( ( 'page' !== get_option( 'show_on_front' ) ) || ( get_option( 'page_for_posts' ) != $q['page_id'] ) ) {
$q['p'] = $q['page_id'];
$where = " AND {$wpdb->posts}.ID = " . $q['page_id'];
}
}
// If a search pattern is specified, load the posts that match.
if ( strlen( $q['s'] ) ) {
$search = $this->parse_search( $q );
}
if ( ! $q['suppress_filters'] ) {
/**
* Filters the search SQL that is used in the WHERE clause of WP_Query.
*
* @since 3.0.0
*
* @param string $search Search SQL for WHERE clause.
* @param WP_Query $query The current WP_Query object.
*/
$search = apply_filters_ref_array( 'posts_search', array( $search, &$this ) );
}
// Taxonomies.
if ( ! $this->is_singular ) {
$this->parse_tax_query( $q );
$clauses = $this->tax_query->get_sql( $wpdb->posts, 'ID' );
$join .= $clauses['join'];
$where .= $clauses['where'];
}
if ( $this->is_tax ) {
if ( empty( $post_type ) ) {
// Do a fully inclusive search for currently registered post types of queried taxonomies.
$post_type = array();
$taxonomies = array_keys( $this->tax_query->queried_terms );
foreach ( get_post_types( array( 'exclude_from_search' => false ) ) as $pt ) {
$object_taxonomies = 'attachment' === $pt ? get_taxonomies_for_attachments() : get_object_taxonomies( $pt );
if ( array_intersect( $taxonomies, $object_taxonomies ) ) {
$post_type[] = $pt;
}
}
if ( ! $post_type ) {
$post_type = 'any';
} elseif ( count( $post_type ) === 1 ) {
$post_type = $post_type[0];
} else {
// Sort post types to ensure same cache key generation.
sort( $post_type );
}
$post_status_join = true;
} elseif ( in_array( 'attachment', (array) $post_type, true ) ) {
$post_status_join = true;
}
}
/*
* Ensure that 'taxonomy', 'term', 'term_id', 'cat', and
* 'category_name' vars are set for backward compatibility.
*/
if ( ! empty( $this->tax_query->queried_terms ) ) {
/*
* Set 'taxonomy', 'term', and 'term_id' to the
* first taxonomy other than 'post_tag' or 'category'.
*/
if ( ! isset( $q['taxonomy'] ) ) {
foreach ( $this->tax_query->queried_terms as $queried_taxonomy => $queried_items ) {
if ( empty( $queried_items['terms'][0] ) ) {
continue;
}
if ( ! in_array( $queried_taxonomy, array( 'category', 'post_tag' ), true ) ) {
$q['taxonomy'] = $queried_taxonomy;
if ( 'slug' === $queried_items['field'] ) {
$q['term'] = $queried_items['terms'][0];
} else {
$q['term_id'] = $queried_items['terms'][0];
}
// Take the first one we find.
break;
}
}
}
// 'cat', 'category_name', 'tag_id'.
foreach ( $this->tax_query->queried_terms as $queried_taxonomy => $queried_items ) {
if ( empty( $queried_items['terms'][0] ) ) {
continue;
}
if ( 'category' === $queried_taxonomy ) {
$the_cat = get_term_by( $queried_items['field'], $queried_items['terms'][0], 'category' );
if ( $the_cat ) {
$this->set( 'cat', $the_cat->term_id );
$this->set( 'category_name', $the_cat->slug );
}
unset( $the_cat );
}
if ( 'post_tag' === $queried_taxonomy ) {
$the_tag = get_term_by( $queried_items['field'], $queried_items['terms'][0], 'post_tag' );
if ( $the_tag ) {
$this->set( 'tag_id', $the_tag->term_id );
}
unset( $the_tag );
}
}
}
if ( ! empty( $this->tax_query->queries ) || ! empty( $this->meta_query->queries ) || ! empty( $this->allow_query_attachment_by_filename ) ) {
$groupby = "{$wpdb->posts}.ID";
}
// Author/user stuff.
if ( ! empty( $q['author'] ) && '0' != $q['author'] ) {
$q['author'] = addslashes_gpc( '' . urldecode( $q['author'] ) );
$authors = array_unique( array_map( 'intval', preg_split( '/[,\s]+/', $q['author'] ) ) );
foreach ( $authors as $author ) {
$key = $author > 0 ? 'author__in' : 'author__not_in';
$q[ $key ][] = abs( $author );
}
$q['author'] = implode( ',', $authors );
}
if ( ! empty( $q['author__not_in'] ) ) {
$author__not_in = implode( ',', array_map( 'absint', array_unique( (array) $q['author__not_in'] ) ) );
$where .= " AND {$wpdb->posts}.post_author NOT IN ($author__not_in) ";
} elseif ( ! empty( $q['author__in'] ) ) {
$author__in = implode( ',', array_map( 'absint', array_unique( (array) $q['author__in'] ) ) );
$where .= " AND {$wpdb->posts}.post_author IN ($author__in) ";
}
// Author stuff for nice URLs.
if ( '' !== $q['author_name'] ) {
if ( str_contains( $q['author_name'], '/' ) ) {
$q['author_name'] = explode( '/', $q['author_name'] );
if ( $q['author_name'][ count( $q['author_name'] ) - 1 ] ) {
$q['author_name'] = $q['author_name'][ count( $q['author_name'] ) - 1 ]; // No trailing slash.
} else {
$q['author_name'] = $q['author_name'][ count( $q['author_name'] ) - 2 ]; // There was a trailing slash.
}
}
$q['author_name'] = sanitize_title_for_query( $q['author_name'] );
$q['author'] = get_user_by( 'slug', $q['author_name'] );
if ( $q['author'] ) {
$q['author'] = $q['author']->ID;
}
$whichauthor .= " AND ({$wpdb->posts}.post_author = " . absint( $q['author'] ) . ')';
}
// Matching by comment count.
if ( isset( $q['comment_count'] ) ) {
// Numeric comment count is converted to array format.
if ( is_numeric( $q['comment_count'] ) ) {
$q['comment_count'] = array(
'value' => (int) $q['comment_count'],
);
}
if ( isset( $q['comment_count']['value'] ) ) {
$q['comment_count'] = array_merge(
array(
'compare' => '=',
),
$q['comment_count']
);
// Fallback for invalid compare operators is '='.
$compare_operators = array( '=', '!=', '>', '>=', '<', '<=' );
if ( ! in_array( $q['comment_count']['compare'], $compare_operators, true ) ) {
$q['comment_count']['compare'] = '=';
}
$where .= $wpdb->prepare( " AND {$wpdb->posts}.comment_count {$q['comment_count']['compare']} %d", $q['comment_count']['value'] );
}
}
// MIME-Type stuff for attachment browsing.
if ( isset( $q['post_mime_type'] ) && '' !== $q['post_mime_type'] ) {
$whichmimetype = wp_post_mime_type_where( $q['post_mime_type'], $wpdb->posts );
}
$where .= $search . $whichauthor . $whichmimetype;
if ( ! empty( $this->allow_query_attachment_by_filename ) ) {
$join .= " LEFT JOIN {$wpdb->postmeta} AS sq1 ON ( {$wpdb->posts}.ID = sq1.post_id AND sq1.meta_key = '_wp_attached_file' )";
}
if ( ! empty( $this->meta_query->queries ) ) {
$clauses = $this->meta_query->get_sql( 'post', $wpdb->posts, 'ID', $this );
$join .= $clauses['join'];
$where .= $clauses['where'];
}
$rand = ( isset( $q['orderby'] ) && 'rand' === $q['orderby'] );
if ( ! isset( $q['order'] ) ) {
$q['order'] = $rand ? '' : 'DESC';
} else {
$q['order'] = $rand ? '' : $this->parse_order( $q['order'] );
}
// These values of orderby should ignore the 'order' parameter.
$force_asc = array( 'post__in', 'post_name__in', 'post_parent__in' );
if ( isset( $q['orderby'] ) && in_array( $q['orderby'], $force_asc, true ) ) {
$q['order'] = '';
}
// Order by.
if ( empty( $q['orderby'] ) ) {
/*
* Boolean false or empty array blanks out ORDER BY,
* while leaving the value unset or otherwise empty sets the default.
*/
if ( isset( $q['orderby'] ) && ( is_array( $q['orderby'] ) || false === $q['orderby'] ) ) {
$orderby = '';
} else {
$orderby = "{$wpdb->posts}.post_date " . $q['order'];
}
} elseif ( 'none' === $q['orderby'] ) {
$orderby = '';
} else {
$orderby_array = array();
if ( is_array( $q['orderby'] ) ) {
foreach ( $q['orderby'] as $_orderby => $order ) {
$orderby = addslashes_gpc( urldecode( $_orderby ) );
$parsed = $this->parse_orderby( $orderby );
if ( ! $parsed ) {
continue;
}
$orderby_array[] = $parsed . ' ' . $this->parse_order( $order );
}
$orderby = implode( ', ', $orderby_array );
} else {
$q['orderby'] = urldecode( $q['orderby'] );
$q['orderby'] = addslashes_gpc( $q['orderby'] );
foreach ( explode( ' ', $q['orderby'] ) as $i => $orderby ) {
$parsed = $this->parse_orderby( $orderby );
// Only allow certain values for safety.
if ( ! $parsed ) {
continue;
}
$orderby_array[] = $parsed;
}
$orderby = implode( ' ' . $q['order'] . ', ', $orderby_array );
if ( empty( $orderby ) ) {
$orderby = "{$wpdb->posts}.post_date " . $q['order'];
} elseif ( ! empty( $q['order'] ) ) {
$orderby .= " {$q['order']}";
}
}
}
// Order search results by relevance only when another "orderby" is not specified in the query.
if ( ! empty( $q['s'] ) ) {
$search_orderby = '';
if ( ! empty( $q['search_orderby_title'] ) && ( empty( $q['orderby'] ) && ! $this->is_feed ) || ( isset( $q['orderby'] ) && 'relevance' === $q['orderby'] ) ) {
$search_orderby = $this->parse_search_order( $q );
}
if ( ! $q['suppress_filters'] ) {
/**
* Filters the ORDER BY used when ordering search results.
*
* @since 3.7.0
*
* @param string $search_orderby The ORDER BY clause.
* @param WP_Query $query The current WP_Query instance.
*/
$search_orderby = apply_filters( 'posts_search_orderby', $search_orderby, $this );
}
if ( $search_orderby ) {
$orderby = $orderby ? $search_orderby . ', ' . $orderby : $search_orderby;
}
}
if ( is_array( $post_type ) && count( $post_type ) > 1 ) {
$post_type_cap = 'multiple_post_type';
} else {
if ( is_array( $post_type ) ) {
$post_type = reset( $post_type );
}
$post_type_object = get_post_type_object( $post_type );
if ( empty( $post_type_object ) ) {
$post_type_cap = $post_type;
}
}
if ( isset( $q['post_password'] ) ) {
$where .= $wpdb->prepare( " AND {$wpdb->posts}.post_password = %s", $q['post_password'] );
if ( empty( $q['perm'] ) ) {
$q['perm'] = 'readable';
}
} elseif ( isset( $q['has_password'] ) ) {
$where .= sprintf( " AND {$wpdb->posts}.post_password %s ''", $q['has_password'] ? '!=' : '=' );
}
if ( ! empty( $q['comment_status'] ) ) {
$where .= $wpdb->prepare( " AND {$wpdb->posts}.comment_status = %s ", $q['comment_status'] );
}
if ( ! empty( $q['ping_status'] ) ) {
$where .= $wpdb->prepare( " AND {$wpdb->posts}.ping_status = %s ", $q['ping_status'] );
}
$skip_post_status = false;
if ( 'any' === $post_type ) {
$in_search_post_types = get_post_types( array( 'exclude_from_search' => false ) );
if ( empty( $in_search_post_types ) ) {
$post_type_where = ' AND 1=0 ';
$skip_post_status = true;
} else {
$post_type_where = " AND {$wpdb->posts}.post_type IN ('" . implode( "', '", array_map( 'esc_sql', $in_search_post_types ) ) . "')";
}
} elseif ( ! empty( $post_type ) && is_array( $post_type ) ) {
// Sort post types to ensure same cache key generation.
sort( $post_type );
$post_type_where = " AND {$wpdb->posts}.post_type IN ('" . implode( "', '", esc_sql( $post_type ) ) . "')";
} elseif ( ! empty( $post_type ) ) {
$post_type_where = $wpdb->prepare( " AND {$wpdb->posts}.post_type = %s", $post_type );
$post_type_object = get_post_type_object( $post_type );
} elseif ( $this->is_attachment ) {
$post_type_where = " AND {$wpdb->posts}.post_type = 'attachment'";
$post_type_object = get_post_type_object( 'attachment' );
} elseif ( $this->is_page ) {
$post_type_where = " AND {$wpdb->posts}.post_type = 'page'";
$post_type_object = get_post_type_object( 'page' );
} else {
$post_type_where = " AND {$wpdb->posts}.post_type = 'post'";
$post_type_object = get_post_type_object( 'post' );
}
$edit_cap = 'edit_post';
$read_cap = 'read_post';
if ( ! empty( $post_type_object ) ) {
$edit_others_cap = $post_type_object->cap->edit_others_posts;
$read_private_cap = $post_type_object->cap->read_private_posts;
} else {
$edit_others_cap = 'edit_others_' . $post_type_cap . 's';
$read_private_cap = 'read_private_' . $post_type_cap . 's';
}
$user_id = get_current_user_id();
$q_status = array();
if ( $skip_post_status ) {
$where .= $post_type_where;
} elseif ( ! empty( $q['post_status'] ) ) {
$where .= $post_type_where;
$statuswheres = array();
$q_status = $q['post_status'];
if ( ! is_array( $q_status ) ) {
$q_status = explode( ',', $q_status );
}
$r_status = array();
$p_status = array();
$e_status = array();
if ( in_array( 'any', $q_status, true ) ) {
foreach ( get_post_stati( array( 'exclude_from_search' => true ) ) as $status ) {
if ( ! in_array( $status, $q_status, true ) ) {
$e_status[] = "{$wpdb->posts}.post_status <> '$status'";
}
}
} else {
foreach ( get_post_stati() as $status ) {
if ( in_array( $status, $q_status, true ) ) {
if ( 'private' === $status ) {
$p_status[] = "{$wpdb->posts}.post_status = '$status'";
} else {
$r_status[] = "{$wpdb->posts}.post_status = '$status'";
}
}
}
}
if ( empty( $q['perm'] ) || 'readable' !== $q['perm'] ) {
$r_status = array_merge( $r_status, $p_status );
unset( $p_status );
}
if ( ! empty( $e_status ) ) {
$statuswheres[] = '(' . implode( ' AND ', $e_status ) . ')';
}
if ( ! empty( $r_status ) ) {
if ( ! empty( $q['perm'] ) && 'editable' === $q['perm'] && ! current_user_can( $edit_others_cap ) ) {
$statuswheres[] = "({$wpdb->posts}.post_author = $user_id " . 'AND (' . implode( ' OR ', $r_status ) . '))';
} else {
$statuswheres[] = '(' . implode( ' OR ', $r_status ) . ')';
}
}
if ( ! empty( $p_status ) ) {
if ( ! empty( $q['perm'] ) && 'readable' === $q['perm'] && ! current_user_can( $read_private_cap ) ) {
$statuswheres[] = "({$wpdb->posts}.post_author = $user_id " . 'AND (' . implode( ' OR ', $p_status ) . '))';
} else {
$statuswheres[] = '(' . implode( ' OR ', $p_status ) . ')';
}
}
if ( $post_status_join ) {
$join .= " LEFT JOIN {$wpdb->posts} AS p2 ON ({$wpdb->posts}.post_parent = p2.ID) ";
foreach ( $statuswheres as $index => $statuswhere ) {
$statuswheres[ $index ] = "($statuswhere OR ({$wpdb->posts}.post_status = 'inherit' AND " . str_replace( $wpdb->posts, 'p2', $statuswhere ) . '))';
}
}
$where_status = implode( ' OR ', $statuswheres );
if ( ! empty( $where_status ) ) {
$where .= " AND ($where_status)";
}
} elseif ( ! $this->is_singular ) {
if ( 'any' === $post_type ) {
$queried_post_types = get_post_types( array( 'exclude_from_search' => false ) );
} elseif ( is_array( $post_type ) ) {
$queried_post_types = $post_type;
} elseif ( ! empty( $post_type ) ) {
$queried_post_types = array( $post_type );
} else {
$queried_post_types = array( 'post' );
}
if ( ! empty( $queried_post_types ) ) {
sort( $queried_post_types );
$status_type_clauses = array();
foreach ( $queried_post_types as $queried_post_type ) {
$queried_post_type_object = get_post_type_object( $queried_post_type );
$type_where = '(' . $wpdb->prepare( "{$wpdb->posts}.post_type = %s AND (", $queried_post_type );
// Public statuses.
$public_statuses = get_post_stati( array( 'public' => true ) );
$status_clauses = array();
foreach ( $public_statuses as $public_status ) {
$status_clauses[] = "{$wpdb->posts}.post_status = '$public_status'";
}
$type_where .= implode( ' OR ', $status_clauses );
// Add protected states that should show in the admin all list.
if ( $this->is_admin ) {
$admin_all_statuses = get_post_stati(
array(
'protected' => true,
'show_in_admin_all_list' => true,
)
);
foreach ( $admin_all_statuses as $admin_all_status ) {
$type_where .= " OR {$wpdb->posts}.post_status = '$admin_all_status'";
}
}
// Add private states that are visible to current user.
if ( is_user_logged_in() && $queried_post_type_object instanceof WP_Post_Type ) {
$read_private_cap = $queried_post_type_object->cap->read_private_posts;
$private_statuses = get_post_stati( array( 'private' => true ) );
foreach ( $private_statuses as $private_status ) {
$type_where .= current_user_can( $read_private_cap ) ? " \nOR {$wpdb->posts}.post_status = '$private_status'" : " \nOR ({$wpdb->posts}.post_author = $user_id AND {$wpdb->posts}.post_status = '$private_status')";
}
}
$type_where .= '))';
$status_type_clauses[] = $type_where;
}
if ( ! empty( $status_type_clauses ) ) {
$where .= ' AND (' . implode( ' OR ', $status_type_clauses ) . ')';
}
} else {
$where .= ' AND 1=0 ';
}
} else {
$where .= $post_type_where;
}
/*
* Apply filters on where and join prior to paging so that any
* manipulations to them are reflected in the paging by day queries.
*/
if ( ! $q['suppress_filters'] ) {
/**
* Filters the WHERE clause of the query.
*
* @since 1.5.0
*
* @param string $where The WHERE clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$where = apply_filters_ref_array( 'posts_where', array( $where, &$this ) );
/**
* Filters the JOIN clause of the query.
*
* @since 1.5.0
*
* @param string $join The JOIN clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$join = apply_filters_ref_array( 'posts_join', array( $join, &$this ) );
}
// Paging.
if ( empty( $q['nopaging'] ) && ! $this->is_singular ) {
$page = absint( $q['paged'] );
if ( ! $page ) {
$page = 1;
}
// If 'offset' is provided, it takes precedence over 'paged'.
if ( isset( $q['offset'] ) && is_numeric( $q['offset'] ) ) {
$q['offset'] = absint( $q['offset'] );
$pgstrt = $q['offset'] . ', ';
} else {
$pgstrt = absint( ( $page - 1 ) * $q['posts_per_page'] ) . ', ';
}
$limits = 'LIMIT ' . $pgstrt . $q['posts_per_page'];
}
// Comments feeds.
if ( $this->is_comment_feed && ! $this->is_singular ) {
if ( $this->is_archive || $this->is_search ) {
$cjoin = "JOIN {$wpdb->posts} ON ( {$wpdb->comments}.comment_post_ID = {$wpdb->posts}.ID ) $join ";
$cwhere = "WHERE comment_approved = '1' $where";
$cgroupby = "{$wpdb->comments}.comment_id";
} else { // Other non-singular, e.g. front.
$cjoin = "JOIN {$wpdb->posts} ON ( {$wpdb->comments}.comment_post_ID = {$wpdb->posts}.ID )";
$cwhere = "WHERE ( post_status = 'publish' OR ( post_status = 'inherit' AND post_type = 'attachment' ) ) AND comment_approved = '1'";
$cgroupby = '';
}
if ( ! $q['suppress_filters'] ) {
/**
* Filters the JOIN clause of the comments feed query before sending.
*
* @since 2.2.0
*
* @param string $cjoin The JOIN clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$cjoin = apply_filters_ref_array( 'comment_feed_join', array( $cjoin, &$this ) );
/**
* Filters the WHERE clause of the comments feed query before sending.
*
* @since 2.2.0
*
* @param string $cwhere The WHERE clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$cwhere = apply_filters_ref_array( 'comment_feed_where', array( $cwhere, &$this ) );
/**
* Filters the GROUP BY clause of the comments feed query before sending.
*
* @since 2.2.0
*
* @param string $cgroupby The GROUP BY clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$cgroupby = apply_filters_ref_array( 'comment_feed_groupby', array( $cgroupby, &$this ) );
/**
* Filters the ORDER BY clause of the comments feed query before sending.
*
* @since 2.8.0
*
* @param string $corderby The ORDER BY clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$corderby = apply_filters_ref_array( 'comment_feed_orderby', array( 'comment_date_gmt DESC', &$this ) );
/**
* Filters the LIMIT clause of the comments feed query before sending.
*
* @since 2.8.0
*
* @param string $climits The JOIN clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$climits = apply_filters_ref_array( 'comment_feed_limits', array( 'LIMIT ' . get_option( 'posts_per_rss' ), &$this ) );
}
$cgroupby = ( ! empty( $cgroupby ) ) ? 'GROUP BY ' . $cgroupby : '';
$corderby = ( ! empty( $corderby ) ) ? 'ORDER BY ' . $corderby : '';
$climits = ( ! empty( $climits ) ) ? $climits : '';
$comments_request = "SELECT $distinct {$wpdb->comments}.comment_ID FROM {$wpdb->comments} $cjoin $cwhere $cgroupby $corderby $climits";
$key = md5( $comments_request );
$last_changed = wp_cache_get_last_changed( 'comment' ) . ':' . wp_cache_get_last_changed( 'posts' );
$cache_key = "comment_feed:$key:$last_changed";
$comment_ids = wp_cache_get( $cache_key, 'comment-queries' );
if ( false === $comment_ids ) {
$comment_ids = $wpdb->get_col( $comments_request );
wp_cache_add( $cache_key, $comment_ids, 'comment-queries' );
}
_prime_comment_caches( $comment_ids );
// Convert to WP_Comment.
/** @var WP_Comment[] */
$this->comments = array_map( 'get_comment', $comment_ids );
$this->comment_count = count( $this->comments );
$post_ids = array();
foreach ( $this->comments as $comment ) {
$post_ids[] = (int) $comment->comment_post_ID;
}
$post_ids = implode( ',', $post_ids );
$join = '';
if ( $post_ids ) {
$where = "AND {$wpdb->posts}.ID IN ($post_ids) ";
} else {
$where = 'AND 0';
}
}
$pieces = array( 'where', 'groupby', 'join', 'orderby', 'distinct', 'fields', 'limits' );
/*
* Apply post-paging filters on where and join. Only plugins that
* manipulate paging queries should use these hooks.
*/
if ( ! $q['suppress_filters'] ) {
/**
* Filters the WHERE clause of the query.
*
* Specifically for manipulating paging queries.
*
* @since 1.5.0
*
* @param string $where The WHERE clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$where = apply_filters_ref_array( 'posts_where_paged', array( $where, &$this ) );
/**
* Filters the GROUP BY clause of the query.
*
* @since 2.0.0
*
* @param string $groupby The GROUP BY clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$groupby = apply_filters_ref_array( 'posts_groupby', array( $groupby, &$this ) );
/**
* Filters the JOIN clause of the query.
*
* Specifically for manipulating paging queries.
*
* @since 1.5.0
*
* @param string $join The JOIN clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$join = apply_filters_ref_array( 'posts_join_paged', array( $join, &$this ) );
/**
* Filters the ORDER BY clause of the query.
*
* @since 1.5.1
*
* @param string $orderby The ORDER BY clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$orderby = apply_filters_ref_array( 'posts_orderby', array( $orderby, &$this ) );
/**
* Filters the DISTINCT clause of the query.
*
* @since 2.1.0
*
* @param string $distinct The DISTINCT clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$distinct = apply_filters_ref_array( 'posts_distinct', array( $distinct, &$this ) );
/**
* Filters the LIMIT clause of the query.
*
* @since 2.1.0
*
* @param string $limits The LIMIT clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$limits = apply_filters_ref_array( 'post_limits', array( $limits, &$this ) );
/**
* Filters the SELECT clause of the query.
*
* @since 2.1.0
*
* @param string $fields The SELECT clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$fields = apply_filters_ref_array( 'posts_fields', array( $fields, &$this ) );
/**
* Filters all query clauses at once, for convenience.
*
* Covers the WHERE, GROUP BY, JOIN, ORDER BY, DISTINCT,
* fields (SELECT), and LIMIT clauses.
*
* @since 3.1.0
*
* @param string[] $clauses {
* Associative array of the clauses for the query.
*
* @type string $where The WHERE clause of the query.
* @type string $groupby The GROUP BY clause of the query.
* @type string $join The JOIN clause of the query.
* @type string $orderby The ORDER BY clause of the query.
* @type string $distinct The DISTINCT clause of the query.
* @type string $fields The SELECT clause of the query.
* @type string $limits The LIMIT clause of the query.
* }
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$clauses = (array) apply_filters_ref_array( 'posts_clauses', array( compact( $pieces ), &$this ) );
$where = isset( $clauses['where'] ) ? $clauses['where'] : '';
$groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : '';
$join = isset( $clauses['join'] ) ? $clauses['join'] : '';
$orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : '';
$distinct = isset( $clauses['distinct'] ) ? $clauses['distinct'] : '';
$fields = isset( $clauses['fields'] ) ? $clauses['fields'] : '';
$limits = isset( $clauses['limits'] ) ? $clauses['limits'] : '';
}
/**
* Fires to announce the query's current selection parameters.
*
* For use by caching plugins.
*
* @since 2.3.0
*
* @param string $selection The assembled selection query.
*/
do_action( 'posts_selection', $where . $groupby . $orderby . $limits . $join );
/*
* Filters again for the benefit of caching plugins.
* Regular plugins should use the hooks above.
*/
if ( ! $q['suppress_filters'] ) {
/**
* Filters the WHERE clause of the query.
*
* For use by caching plugins.
*
* @since 2.5.0
*
* @param string $where The WHERE clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$where = apply_filters_ref_array( 'posts_where_request', array( $where, &$this ) );
/**
* Filters the GROUP BY clause of the query.
*
* For use by caching plugins.
*
* @since 2.5.0
*
* @param string $groupby The GROUP BY clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$groupby = apply_filters_ref_array( 'posts_groupby_request', array( $groupby, &$this ) );
/**
* Filters the JOIN clause of the query.
*
* For use by caching plugins.
*
* @since 2.5.0
*
* @param string $join The JOIN clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$join = apply_filters_ref_array( 'posts_join_request', array( $join, &$this ) );
/**
* Filters the ORDER BY clause of the query.
*
* For use by caching plugins.
*
* @since 2.5.0
*
* @param string $orderby The ORDER BY clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$orderby = apply_filters_ref_array( 'posts_orderby_request', array( $orderby, &$this ) );
/**
* Filters the DISTINCT clause of the query.
*
* For use by caching plugins.
*
* @since 2.5.0
*
* @param string $distinct The DISTINCT clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$distinct = apply_filters_ref_array( 'posts_distinct_request', array( $distinct, &$this ) );
/**
* Filters the SELECT clause of the query.
*
* For use by caching plugins.
*
* @since 2.5.0
*
* @param string $fields The SELECT clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$fields = apply_filters_ref_array( 'posts_fields_request', array( $fields, &$this ) );
/**
* Filters the LIMIT clause of the query.
*
* For use by caching plugins.
*
* @since 2.5.0
*
* @param string $limits The LIMIT clause of the query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$limits = apply_filters_ref_array( 'post_limits_request', array( $limits, &$this ) );
/**
* Filters all query clauses at once, for convenience.
*
* For use by caching plugins.
*
* Covers the WHERE, GROUP BY, JOIN, ORDER BY, DISTINCT,
* fields (SELECT), and LIMIT clauses.
*
* @since 3.1.0
*
* @param string[] $clauses {
* Associative array of the clauses for the query.
*
* @type string $where The WHERE clause of the query.
* @type string $groupby The GROUP BY clause of the query.
* @type string $join The JOIN clause of the query.
* @type string $orderby The ORDER BY clause of the query.
* @type string $distinct The DISTINCT clause of the query.
* @type string $fields The SELECT clause of the query.
* @type string $limits The LIMIT clause of the query.
* }
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$clauses = (array) apply_filters_ref_array( 'posts_clauses_request', array( compact( $pieces ), &$this ) );
$where = isset( $clauses['where'] ) ? $clauses['where'] : '';
$groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : '';
$join = isset( $clauses['join'] ) ? $clauses['join'] : '';
$orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : '';
$distinct = isset( $clauses['distinct'] ) ? $clauses['distinct'] : '';
$fields = isset( $clauses['fields'] ) ? $clauses['fields'] : '';
$limits = isset( $clauses['limits'] ) ? $clauses['limits'] : '';
}
if ( ! empty( $groupby ) ) {
$groupby = 'GROUP BY ' . $groupby;
}
if ( ! empty( $orderby ) ) {
$orderby = 'ORDER BY ' . $orderby;
}
$found_rows = '';
if ( ! $q['no_found_rows'] && ! empty( $limits ) ) {
$found_rows = 'SQL_CALC_FOUND_ROWS';
}
/*
* Beginning of the string is on a new line to prevent leading whitespace.
*
* The additional indentation of subsequent lines is to ensure the SQL
* queries are identical to those generated when splitting queries. This
* improves caching of the query by ensuring the same cache key is
* generated for the same database queries functionally.
*
* See https://core.trac.wordpress.org/ticket/56841.
* See https://github.com/WordPress/wordpress-develop/pull/6393#issuecomment-2088217429
*/
$old_request =
"SELECT $found_rows $distinct $fields
FROM {$wpdb->posts} $join
WHERE 1=1 $where
$groupby
$orderby
$limits";
$this->request = $old_request;
if ( ! $q['suppress_filters'] ) {
/**
* Filters the completed SQL query before sending.
*
* @since 2.0.0
*
* @param string $request The complete SQL query.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$this->request = apply_filters_ref_array( 'posts_request', array( $this->request, &$this ) );
}
/**
* Filters the posts array before the query takes place.
*
* Return a non-null value to bypass WordPress' default post queries.
*
* Filtering functions that require pagination information are encouraged to set
* the `found_posts` and `max_num_pages` properties of the WP_Query object,
* passed to the filter by reference. If WP_Query does not perform a database
* query, it will not have enough information to generate these values itself.
*
* @since 4.6.0
*
* @param WP_Post[]|int[]|null $posts Return an array of post data to short-circuit WP's query,
* or null to allow WP to run its normal queries.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$this->posts = apply_filters_ref_array( 'posts_pre_query', array( null, &$this ) );
/*
* Ensure the ID database query is able to be cached.
*
* Random queries are expected to have unpredictable results and
* cannot be cached. Note the space before `RAND` in the string
* search, that to ensure against a collision with another
* function.
*
* If `$fields` has been modified by the `posts_fields`,
* `posts_fields_request`, `post_clauses` or `posts_clauses_request`
* filters, then caching is disabled to prevent caching collisions.
*/
$id_query_is_cacheable = ! str_contains( strtoupper( $orderby ), ' RAND(' );
$cacheable_field_values = array(
"{$wpdb->posts}.*",
"{$wpdb->posts}.ID, {$wpdb->posts}.post_parent",
"{$wpdb->posts}.ID",
);
if ( ! in_array( $fields, $cacheable_field_values, true ) ) {
$id_query_is_cacheable = false;
}
if ( $q['cache_results'] && $id_query_is_cacheable ) {
$new_request = str_replace( $fields, "{$wpdb->posts}.*", $this->request );
$cache_key = $this->generate_cache_key( $q, $new_request );
$cache_found = false;
if ( null === $this->posts ) {
$cached_results = wp_cache_get( $cache_key, 'post-queries', false, $cache_found );
if ( $cached_results ) {
/** @var int[] */
$post_ids = array_map( 'intval', $cached_results['posts'] );
$this->post_count = count( $post_ids );
$this->found_posts = $cached_results['found_posts'];
$this->max_num_pages = $cached_results['max_num_pages'];
if ( 'ids' === $q['fields'] ) {
$this->posts = $post_ids;
return $this->posts;
} elseif ( 'id=>parent' === $q['fields'] ) {
_prime_post_parent_id_caches( $post_ids );
$post_parent_cache_keys = array();
foreach ( $post_ids as $post_id ) {
$post_parent_cache_keys[] = 'post_parent:' . (string) $post_id;
}
/** @var int[] */
$post_parents = wp_cache_get_multiple( $post_parent_cache_keys, 'posts' );
foreach ( $post_parents as $cache_key => $post_parent ) {
$obj = new stdClass();
$obj->ID = (int) str_replace( 'post_parent:', '', $cache_key );
$obj->post_parent = (int) $post_parent;
$this->posts[] = $obj;
}
return $post_parents;
} else {
_prime_post_caches( $post_ids, $q['update_post_term_cache'], $q['update_post_meta_cache'] );
/** @var WP_Post[] */
$this->posts = array_map( 'get_post', $post_ids );
}
}
}
}
if ( 'ids' === $q['fields'] ) {
if ( null === $this->posts ) {
$this->posts = $wpdb->get_col( $this->request );
}
/** @var int[] */
$this->posts = array_map( 'intval', $this->posts );
$this->post_count = count( $this->posts );
$this->set_found_posts( $q, $limits );
if ( $q['cache_results'] && $id_query_is_cacheable ) {
$cache_value = array(
'posts' => $this->posts,
'found_posts' => $this->found_posts,
'max_num_pages' => $this->max_num_pages,
);
wp_cache_set( $cache_key, $cache_value, 'post-queries' );
}
return $this->posts;
}
if ( 'id=>parent' === $q['fields'] ) {
if ( null === $this->posts ) {
$this->posts = $wpdb->get_results( $this->request );
}
$this->post_count = count( $this->posts );
$this->set_found_posts( $q, $limits );
/** @var int[] */
$post_parents = array();
$post_ids = array();
$post_parents_cache = array();
foreach ( $this->posts as $key => $post ) {
$this->posts[ $key ]->ID = (int) $post->ID;
$this->posts[ $key ]->post_parent = (int) $post->post_parent;
$post_parents[ (int) $post->ID ] = (int) $post->post_parent;
$post_ids[] = (int) $post->ID;
$post_parents_cache[ 'post_parent:' . (string) $post->ID ] = (int) $post->post_parent;
}
// Prime post parent caches, so that on second run, there is not another database query.
wp_cache_add_multiple( $post_parents_cache, 'posts' );
if ( $q['cache_results'] && $id_query_is_cacheable ) {
$cache_value = array(
'posts' => $post_ids,
'found_posts' => $this->found_posts,
'max_num_pages' => $this->max_num_pages,
);
wp_cache_set( $cache_key, $cache_value, 'post-queries' );
}
return $post_parents;
}
$is_unfiltered_query = $old_request == $this->request && "{$wpdb->posts}.*" === $fields;
if ( null === $this->posts ) {
$split_the_query = (
$is_unfiltered_query
&& (
wp_using_ext_object_cache()
|| ( ! empty( $limits ) && $q['posts_per_page'] < 500 )
)
);
/**
* Filters whether to split the query.
*
* Splitting the query will cause it to fetch just the IDs of the found posts
* (and then individually fetch each post by ID), rather than fetching every
* complete row at once. One massive result vs. many small results.
*
* @since 3.4.0
* @since 6.6.0 Added the `$old_request` and `$clauses` parameters.
*
* @param bool $split_the_query Whether or not to split the query.
* @param WP_Query $query The WP_Query instance.
* @param string $old_request The complete SQL query before filtering.
* @param string[] $clauses {
* Associative array of the clauses for the query.
*
* @type string $where The WHERE clause of the query.
* @type string $groupby The GROUP BY clause of the query.
* @type string $join The JOIN clause of the query.
* @type string $orderby The ORDER BY clause of the query.
* @type string $distinct The DISTINCT clause of the query.
* @type string $fields The SELECT clause of the query.
* @type string $limits The LIMIT clause of the query.
* }
*/
$split_the_query = apply_filters( 'split_the_query', $split_the_query, $this, $old_request, compact( $pieces ) );
if ( $split_the_query ) {
// First get the IDs and then fill in the objects.
// Beginning of the string is on a new line to prevent leading whitespace. See https://core.trac.wordpress.org/ticket/56841.
$this->request =
"SELECT $found_rows $distinct {$wpdb->posts}.ID
FROM {$wpdb->posts} $join
WHERE 1=1 $where
$groupby
$orderby
$limits";
/**
* Filters the Post IDs SQL request before sending.
*
* @since 3.4.0
*
* @param string $request The post ID request.
* @param WP_Query $query The WP_Query instance.
*/
$this->request = apply_filters( 'posts_request_ids', $this->request, $this );
$post_ids = $wpdb->get_col( $this->request );
if ( $post_ids ) {
$this->posts = $post_ids;
$this->set_found_posts( $q, $limits );
_prime_post_caches( $post_ids, $q['update_post_term_cache'], $q['update_post_meta_cache'] );
} else {
$this->posts = array();
}
} else {
$this->posts = $wpdb->get_results( $this->request );
$this->set_found_posts( $q, $limits );
}
}
// Convert to WP_Post objects.
if ( $this->posts ) {
/** @var WP_Post[] */
$this->posts = array_map( 'get_post', $this->posts );
}
$unfiltered_posts = $this->posts;
if ( $q['cache_results'] && $id_query_is_cacheable && ! $cache_found ) {
$post_ids = wp_list_pluck( $this->posts, 'ID' );
$cache_value = array(
'posts' => $post_ids,
'found_posts' => $this->found_posts,
'max_num_pages' => $this->max_num_pages,
);
wp_cache_set( $cache_key, $cache_value, 'post-queries' );
}
if ( ! $q['suppress_filters'] ) {
/**
* Filters the raw post results array, prior to status checks.
*
* @since 2.3.0
*
* @param WP_Post[] $posts Array of post objects.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$this->posts = apply_filters_ref_array( 'posts_results', array( $this->posts, &$this ) );
}
if ( ! empty( $this->posts ) && $this->is_comment_feed && $this->is_singular ) {
/** This filter is documented in wp-includes/query.php */
$cjoin = apply_filters_ref_array( 'comment_feed_join', array( '', &$this ) );
/** This filter is documented in wp-includes/query.php */
$cwhere = apply_filters_ref_array( 'comment_feed_where', array( "WHERE comment_post_ID = '{$this->posts[0]->ID}' AND comment_approved = '1'", &$this ) );
/** This filter is documented in wp-includes/query.php */
$cgroupby = apply_filters_ref_array( 'comment_feed_groupby', array( '', &$this ) );
$cgroupby = ( ! empty( $cgroupby ) ) ? 'GROUP BY ' . $cgroupby : '';
/** This filter is documented in wp-includes/query.php */
$corderby = apply_filters_ref_array( 'comment_feed_orderby', array( 'comment_date_gmt DESC', &$this ) );
$corderby = ( ! empty( $corderby ) ) ? 'ORDER BY ' . $corderby : '';
/** This filter is documented in wp-includes/query.php */
$climits = apply_filters_ref_array( 'comment_feed_limits', array( 'LIMIT ' . get_option( 'posts_per_rss' ), &$this ) );
$comments_request = "SELECT {$wpdb->comments}.comment_ID FROM {$wpdb->comments} $cjoin $cwhere $cgroupby $corderby $climits";
$comment_key = md5( $comments_request );
$comment_last_changed = wp_cache_get_last_changed( 'comment' );
$comment_cache_key = "comment_feed:$comment_key:$comment_last_changed";
$comment_ids = wp_cache_get( $comment_cache_key, 'comment-queries' );
if ( false === $comment_ids ) {
$comment_ids = $wpdb->get_col( $comments_request );
wp_cache_add( $comment_cache_key, $comment_ids, 'comment-queries' );
}
_prime_comment_caches( $comment_ids );
// Convert to WP_Comment.
/** @var WP_Comment[] */
$this->comments = array_map( 'get_comment', $comment_ids );
$this->comment_count = count( $this->comments );
}
// Check post status to determine if post should be displayed.
if ( ! empty( $this->posts ) && ( $this->is_single || $this->is_page ) ) {
$status = get_post_status( $this->posts[0] );
if ( 'attachment' === $this->posts[0]->post_type && 0 === (int) $this->posts[0]->post_parent ) {
$this->is_page = false;
$this->is_single = true;
$this->is_attachment = true;
}
// If the post_status was specifically requested, let it pass through.
if ( ! in_array( $status, $q_status, true ) ) {
$post_status_obj = get_post_status_object( $status );
if ( $post_status_obj && ! $post_status_obj->public ) {
if ( ! is_user_logged_in() ) {
// User must be logged in to view unpublished posts.
$this->posts = array();
} else {
if ( $post_status_obj->protected ) {
// User must have edit permissions on the draft to preview.
if ( ! current_user_can( $edit_cap, $this->posts[0]->ID ) ) {
$this->posts = array();
} else {
$this->is_preview = true;
if ( 'future' !== $status ) {
$this->posts[0]->post_date = current_time( 'mysql' );
}
}
} elseif ( $post_status_obj->private ) {
if ( ! current_user_can( $read_cap, $this->posts[0]->ID ) ) {
$this->posts = array();
}
} else {
$this->posts = array();
}
}
} elseif ( ! $post_status_obj ) {
// Post status is not registered, assume it's not public.
if ( ! current_user_can( $edit_cap, $this->posts[0]->ID ) ) {
$this->posts = array();
}
}
}
if ( $this->is_preview && $this->posts && current_user_can( $edit_cap, $this->posts[0]->ID ) ) {
/**
* Filters the single post for preview mode.
*
* @since 2.7.0
*
* @param WP_Post $post_preview The Post object.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$this->posts[0] = get_post( apply_filters_ref_array( 'the_preview', array( $this->posts[0], &$this ) ) );
}
}
// Put sticky posts at the top of the posts array.
$sticky_posts = get_option( 'sticky_posts' );
if ( $this->is_home && $page <= 1 && is_array( $sticky_posts ) && ! empty( $sticky_posts ) && ! $q['ignore_sticky_posts'] ) {
$num_posts = count( $this->posts );
$sticky_offset = 0;
// Loop over posts and relocate stickies to the front.
for ( $i = 0; $i < $num_posts; $i++ ) {
if ( in_array( $this->posts[ $i ]->ID, $sticky_posts, true ) ) {
$sticky_post = $this->posts[ $i ];
// Remove sticky from current position.
array_splice( $this->posts, $i, 1 );
// Move to front, after other stickies.
array_splice( $this->posts, $sticky_offset, 0, array( $sticky_post ) );
// Increment the sticky offset. The next sticky will be placed at this offset.
++$sticky_offset;
// Remove post from sticky posts array.
$offset = array_search( $sticky_post->ID, $sticky_posts, true );
unset( $sticky_posts[ $offset ] );
}
}
// If any posts have been excluded specifically, Ignore those that are sticky.
if ( ! empty( $sticky_posts ) && ! empty( $q['post__not_in'] ) ) {
$sticky_posts = array_diff( $sticky_posts, $q['post__not_in'] );
}
// Fetch sticky posts that weren't in the query results.
if ( ! empty( $sticky_posts ) ) {
$stickies = get_posts(
array(
'post__in' => $sticky_posts,
'post_type' => $post_type,
'post_status' => 'publish',
'posts_per_page' => count( $sticky_posts ),
'suppress_filters' => $q['suppress_filters'],
'cache_results' => $q['cache_results'],
'update_post_meta_cache' => $q['update_post_meta_cache'],
'update_post_term_cache' => $q['update_post_term_cache'],
'lazy_load_term_meta' => $q['lazy_load_term_meta'],
)
);
foreach ( $stickies as $sticky_post ) {
array_splice( $this->posts, $sticky_offset, 0, array( $sticky_post ) );
++$sticky_offset;
}
}
}
if ( ! $q['suppress_filters'] ) {
/**
* Filters the array of retrieved posts after they've been fetched and
* internally processed.
*
* @since 1.5.0
*
* @param WP_Post[] $posts Array of post objects.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$this->posts = apply_filters_ref_array( 'the_posts', array( $this->posts, &$this ) );
}
/*
* Ensure that any posts added/modified via one of the filters above are
* of the type WP_Post and are filtered.
*/
if ( $this->posts ) {
$this->post_count = count( $this->posts );
/** @var WP_Post[] */
$this->posts = array_map( 'get_post', $this->posts );
if ( $q['cache_results'] ) {
if ( $is_unfiltered_query && $unfiltered_posts === $this->posts ) {
update_post_caches( $this->posts, $post_type, $q['update_post_term_cache'], $q['update_post_meta_cache'] );
} else {
$post_ids = wp_list_pluck( $this->posts, 'ID' );
_prime_post_caches( $post_ids, $q['update_post_term_cache'], $q['update_post_meta_cache'] );
}
}
/** @var WP_Post */
$this->post = reset( $this->posts );
} else {
$this->post_count = 0;
$this->posts = array();
}
if ( ! empty( $this->posts ) && $q['update_menu_item_cache'] ) {
update_menu_item_cache( $this->posts );
}
if ( $q['lazy_load_term_meta'] ) {
wp_queue_posts_for_term_meta_lazyload( $this->posts );
}
return $this->posts;
}
/**
* Sets up the amount of found posts and the number of pages (if limit clause was used)
* for the current query.
*
* @since 3.5.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @param array $q Query variables.
* @param string $limits LIMIT clauses of the query.
*/
private function set_found_posts( $q, $limits ) {
global $wpdb;
/*
* Bail if posts is an empty array. Continue if posts is an empty string,
* null, or false to accommodate caching plugins that fill posts later.
*/
if ( $q['no_found_rows'] || ( is_array( $this->posts ) && ! $this->posts ) ) {
return;
}
if ( ! empty( $limits ) ) {
/**
* Filters the query to run for retrieving the found posts.
*
* @since 2.1.0
*
* @param string $found_posts_query The query to run to find the found posts.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$found_posts_query = apply_filters_ref_array( 'found_posts_query', array( 'SELECT FOUND_ROWS()', &$this ) );
$this->found_posts = (int) $wpdb->get_var( $found_posts_query );
} else {
if ( is_array( $this->posts ) ) {
$this->found_posts = count( $this->posts );
} else {
if ( null === $this->posts ) {
$this->found_posts = 0;
} else {
$this->found_posts = 1;
}
}
}
/**
* Filters the number of found posts for the query.
*
* @since 2.1.0
*
* @param int $found_posts The number of posts found.
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
$this->found_posts = (int) apply_filters_ref_array( 'found_posts', array( $this->found_posts, &$this ) );
if ( ! empty( $limits ) ) {
$this->max_num_pages = (int) ceil( $this->found_posts / $q['posts_per_page'] );
}
}
/**
* Sets up the next post and iterate current post index.
*
* @since 1.5.0
*
* @return WP_Post Next post.
*/
public function next_post() {
++$this->current_post;
/** @var WP_Post */
$this->post = $this->posts[ $this->current_post ];
return $this->post;
}
/**
* Sets up the current post.
*
* Retrieves the next post, sets up the post, sets the 'in the loop'
* property to true.
*
* @since 1.5.0
*
* @global WP_Post $post Global post object.
*/
public function the_post() {
global $post;
if ( ! $this->in_the_loop ) {
// Only prime the post cache for queries limited to the ID field.
$post_ids = array_filter( $this->posts, 'is_numeric' );
// Exclude any falsey values, such as 0.
$post_ids = array_filter( $post_ids );
if ( $post_ids ) {
_prime_post_caches( $post_ids, $this->query_vars['update_post_term_cache'], $this->query_vars['update_post_meta_cache'] );
}
$post_objects = array_map( 'get_post', $this->posts );
update_post_author_caches( $post_objects );
}
$this->in_the_loop = true;
$this->before_loop = false;
if ( -1 == $this->current_post ) { // Loop has just started.
/**
* Fires once the loop is started.
*
* @since 2.0.0
*
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
do_action_ref_array( 'loop_start', array( &$this ) );
}
$post = $this->next_post();
$this->setup_postdata( $post );
}
/**
* Determines whether there are more posts available in the loop.
*
* Calls the {@see 'loop_end'} action when the loop is complete.
*
* @since 1.5.0
*
* @return bool True if posts are available, false if end of the loop.
*/
public function have_posts() {
if ( $this->current_post + 1 < $this->post_count ) {
return true;
} elseif ( $this->current_post + 1 == $this->post_count && $this->post_count > 0 ) {
/**
* Fires once the loop has ended.
*
* @since 2.0.0
*
* @param WP_Query $query The WP_Query instance (passed by reference).
*/
do_action_ref_array( 'loop_end', array( &$this ) );
// Do some cleaning up after the loop.
$this->rewind_posts();
} elseif ( 0 === $this->post_count ) {
$this->before_loop = false;
/**
* Fires if no results are found in a post query.
*
* @since 4.9.0
*
* @param WP_Query $query The WP_Query instance.
*/
do_action( 'loop_no_results', $this );
}
$this->in_the_loop = false;
return false;
}
/**
* Rewinds the posts and resets post index.
*
* @since 1.5.0
*/
public function rewind_posts() {
$this->current_post = -1;
if ( $this->post_count > 0 ) {
$this->post = $this->posts[0];
}
}
/**
* Iterates current comment index and returns WP_Comment object.
*
* @since 2.2.0
*
* @return WP_Comment Comment object.
*/
public function next_comment() {
++$this->current_comment;
/** @var WP_Comment */
$this->comment = $this->comments[ $this->current_comment ];
return $this->comment;
}
/**
* Sets up the current comment.
*
* @since 2.2.0
*
* @global WP_Comment $comment Global comment object.
*/
public function the_comment() {
global $comment;
$comment = $this->next_comment();
if ( 0 == $this->current_comment ) {
/**
* Fires once the comment loop is started.
*
* @since 2.2.0
*/
do_action( 'comment_loop_start' );
}
}
/**
* Determines whether there are more comments available.
*
* Automatically rewinds comments when finished.
*
* @since 2.2.0
*
* @return bool True if comments are available, false if no more comments.
*/
public function have_comments() {
if ( $this->current_comment + 1 < $this->comment_count ) {
return true;
} elseif ( $this->current_comment + 1 == $this->comment_count ) {
$this->rewind_comments();
}
return false;
}
/**
* Rewinds the comments, resets the comment index and comment to first.
*
* @since 2.2.0
*/
public function rewind_comments() {
$this->current_comment = -1;
if ( $this->comment_count > 0 ) {
$this->comment = $this->comments[0];
}
}
/**
* Sets up the WordPress query by parsing query string.
*
* @since 1.5.0
*
* @see WP_Query::parse_query() for all available arguments.
*
* @param string|array $query URL query string or array of query arguments.
* @return WP_Post[]|int[] Array of post objects or post IDs.
*/
public function query( $query ) {
$this->init();
$this->query = wp_parse_args( $query );
$this->query_vars = $this->query;
return $this->get_posts();
}
/**
* Retrieves the currently queried object.
*
* If queried object is not set, then the queried object will be set from
* the category, tag, taxonomy, posts page, single post, page, or author
* query variable. After it is set up, it will be returned.
*
* @since 1.5.0
*
* @return WP_Term|WP_Post_Type|WP_Post|WP_User|null The queried object.
*/
public function get_queried_object() {
if ( isset( $this->queried_object ) ) {
return $this->queried_object;
}
$this->queried_object = null;
$this->queried_object_id = null;
if ( $this->is_category || $this->is_tag || $this->is_tax ) {
if ( $this->is_category ) {
$cat = $this->get( 'cat' );
$category_name = $this->get( 'category_name' );
if ( $cat ) {
$term = get_term( $cat, 'category' );
} elseif ( $category_name ) {
$term = get_term_by( 'slug', $category_name, 'category' );
}
} elseif ( $this->is_tag ) {
$tag_id = $this->get( 'tag_id' );
$tag = $this->get( 'tag' );
if ( $tag_id ) {
$term = get_term( $tag_id, 'post_tag' );
} elseif ( $tag ) {
$term = get_term_by( 'slug', $tag, 'post_tag' );
}
} else {
// For other tax queries, grab the first term from the first clause.
if ( ! empty( $this->tax_query->queried_terms ) ) {
$queried_taxonomies = array_keys( $this->tax_query->queried_terms );
$matched_taxonomy = reset( $queried_taxonomies );
$query = $this->tax_query->queried_terms[ $matched_taxonomy ];
if ( ! empty( $query['terms'] ) ) {
if ( 'term_id' === $query['field'] ) {
$term = get_term( reset( $query['terms'] ), $matched_taxonomy );
} else {
$term = get_term_by( $query['field'], reset( $query['terms'] ), $matched_taxonomy );
}
}
}
}
if ( ! empty( $term ) && ! is_wp_error( $term ) ) {
$this->queried_object = $term;
$this->queried_object_id = (int) $term->term_id;
if ( $this->is_category && 'category' === $this->queried_object->taxonomy ) {
_make_cat_compat( $this->queried_object );
}
}
} elseif ( $this->is_post_type_archive ) {
$post_type = $this->get( 'post_type' );
if ( is_array( $post_type ) ) {
$post_type = reset( $post_type );
}
$this->queried_object = get_post_type_object( $post_type );
} elseif ( $this->is_posts_page ) {
$page_for_posts = get_option( 'page_for_posts' );
$this->queried_object = get_post( $page_for_posts );
$this->queried_object_id = (int) $this->queried_object->ID;
} elseif ( $this->is_singular && ! empty( $this->post ) ) {
$this->queried_object = $this->post;
$this->queried_object_id = (int) $this->post->ID;
} elseif ( $this->is_author ) {
$author = (int) $this->get( 'author' );
$author_name = $this->get( 'author_name' );
if ( $author ) {
$this->queried_object_id = $author;
} elseif ( $author_name ) {
$user = get_user_by( 'slug', $author_name );
if ( $user ) {
$this->queried_object_id = $user->ID;
}
}
$this->queried_object = get_userdata( $this->queried_object_id );
}
return $this->queried_object;
}
/**
* Retrieves the ID of the currently queried object.
*
* @since 1.5.0
*
* @return int
*/
public function get_queried_object_id() {
$this->get_queried_object();
if ( isset( $this->queried_object_id ) ) {
return $this->queried_object_id;
}
return 0;
}
/**
* Constructor.
*
* Sets up the WordPress query, if parameter is not empty.
*
* @since 1.5.0
*
* @see WP_Query::parse_query() for all available arguments.
*
* @param string|array $query URL query string or array of vars.
*/
public function __construct( $query = '' ) {
if ( ! empty( $query ) ) {
$this->query( $query );
}
}
/**
* Makes private properties readable for backward compatibility.
*
* @since 4.0.0
*
* @param string $name Property to get.
* @return mixed Property.
*/
public function __get( $name ) {
if ( in_array( $name, $this->compat_fields, true ) ) {
return $this->$name;
}
}
/**
* Makes private properties checkable for backward compatibility.
*
* @since 4.0.0
*
* @param string $name Property to check if set.
* @return bool Whether the property is set.
*/
public function __isset( $name ) {
if ( in_array( $name, $this->compat_fields, true ) ) {
return isset( $this->$name );
}
}
/**
* Makes private/protected methods readable for backward compatibility.
*
* @since 4.0.0
*
* @param string $name Method to call.
* @param array $arguments Arguments to pass when calling.
* @return mixed|false Return value of the callback, false otherwise.
*/
public function __call( $name, $arguments ) {
if ( in_array( $name, $this->compat_methods, true ) ) {
return $this->$name( ...$arguments );
}
return false;
}
/**
* Determines whether the query is for an existing archive page.
*
* Archive pages include category, tag, author, date, custom post type,
* and custom taxonomy based archives.
*
* @since 3.1.0
*
* @see WP_Query::is_category()
* @see WP_Query::is_tag()
* @see WP_Query::is_author()
* @see WP_Query::is_date()
* @see WP_Query::is_post_type_archive()
* @see WP_Query::is_tax()
*
* @return bool Whether the query is for an existing archive page.
*/
public function is_archive() {
return (bool) $this->is_archive;
}
/**
* Determines whether the query is for an existing post type archive page.
*
* @since 3.1.0
*
* @param string|string[] $post_types Optional. Post type or array of posts types
* to check against. Default empty.
* @return bool Whether the query is for an existing post type archive page.
*/
public function is_post_type_archive( $post_types = '' ) {
if ( empty( $post_types ) || ! $this->is_post_type_archive ) {
return (bool) $this->is_post_type_archive;
}
$post_type = $this->get( 'post_type' );
if ( is_array( $post_type ) ) {
$post_type = reset( $post_type );
}
$post_type_object = get_post_type_object( $post_type );
if ( ! $post_type_object ) {
return false;
}
return in_array( $post_type_object->name, (array) $post_types, true );
}
/**
* Determines whether the query is for an existing attachment page.
*
* @since 3.1.0
*
* @param int|string|int[]|string[] $attachment Optional. Attachment ID, title, slug, or array of such
* to check against. Default empty.
* @return bool Whether the query is for an existing attachment page.
*/
public function is_attachment( $attachment = '' ) {
if ( ! $this->is_attachment ) {
return false;
}
if ( empty( $attachment ) ) {
return true;
}
$attachment = array_map( 'strval', (array) $attachment );
$post_obj = $this->get_queried_object();
if ( ! $post_obj ) {
return false;
}
if ( in_array( (string) $post_obj->ID, $attachment, true ) ) {
return true;
} elseif ( in_array( $post_obj->post_title, $attachment, true ) ) {
return true;
} elseif ( in_array( $post_obj->post_name, $attachment, true ) ) {
return true;
}
return false;
}
/**
* Determines whether the query is for an existing author archive page.
*
* If the $author parameter is specified, this function will additionally
* check if the query is for one of the authors specified.
*
* @since 3.1.0
*
* @param int|string|int[]|string[] $author Optional. User ID, nickname, nicename, or array of such
* to check against. Default empty.
* @return bool Whether the query is for an existing author archive page.
*/
public function is_author( $author = '' ) {
if ( ! $this->is_author ) {
return false;
}
if ( empty( $author ) ) {
return true;
}
$author_obj = $this->get_queried_object();
if ( ! $author_obj ) {
return false;
}
$author = array_map( 'strval', (array) $author );
if ( in_array( (string) $author_obj->ID, $author, true ) ) {
return true;
} elseif ( in_array( $author_obj->nickname, $author, true ) ) {
return true;
} elseif ( in_array( $author_obj->user_nicename, $author, true ) ) {
return true;
}
return false;
}
/**
* Determines whether the query is for an existing category archive page.
*
* If the $category parameter is specified, this function will additionally
* check if the query is for one of the categories specified.
*
* @since 3.1.0
*
* @param int|string|int[]|string[] $category Optional. Category ID, name, slug, or array of such
* to check against. Default empty.
* @return bool Whether the query is for an existing category archive page.
*/
public function is_category( $category = '' ) {
if ( ! $this->is_category ) {
return false;
}
if ( empty( $category ) ) {
return true;
}
$cat_obj = $this->get_queried_object();
if ( ! $cat_obj ) {
return false;
}
$category = array_map( 'strval', (array) $category );
if ( in_array( (string) $cat_obj->term_id, $category, true ) ) {
return true;
} elseif ( in_array( $cat_obj->name, $category, true ) ) {
return true;
} elseif ( in_array( $cat_obj->slug, $category, true ) ) {
return true;
}
return false;
}
/**
* Determines whether the query is for an existing tag archive page.
*
* If the $tag parameter is specified, this function will additionally
* check if the query is for one of the tags specified.
*
* @since 3.1.0
*
* @param int|string|int[]|string[] $tag Optional. Tag ID, name, slug, or array of such
* to check against. Default empty.
* @return bool Whether the query is for an existing tag archive page.
*/
public function is_tag( $tag = '' ) {
if ( ! $this->is_tag ) {
return false;
}
if ( empty( $tag ) ) {
return true;
}
$tag_obj = $this->get_queried_object();
if ( ! $tag_obj ) {
return false;
}
$tag = array_map( 'strval', (array) $tag );
if ( in_array( (string) $tag_obj->term_id, $tag, true ) ) {
return true;
} elseif ( in_array( $tag_obj->name, $tag, true ) ) {
return true;
} elseif ( in_array( $tag_obj->slug, $tag, true ) ) {
return true;
}
return false;
}
/**
* Determines whether the query is for an existing custom taxonomy archive page.
*
* If the $taxonomy parameter is specified, this function will additionally
* check if the query is for that specific $taxonomy.
*
* If the $term parameter is specified in addition to the $taxonomy parameter,
* this function will additionally check if the query is for one of the terms
* specified.
*
* @since 3.1.0
*
* @global WP_Taxonomy[] $wp_taxonomies Registered taxonomies.
*
* @param string|string[] $taxonomy Optional. Taxonomy slug or slugs to check against.
* Default empty.
* @param int|string|int[]|string[] $term Optional. Term ID, name, slug, or array of such
* to check against. Default empty.
* @return bool Whether the query is for an existing custom taxonomy archive page.
* True for custom taxonomy archive pages, false for built-in taxonomies
* (category and tag archives).
*/
public function is_tax( $taxonomy = '', $term = '' ) {
global $wp_taxonomies;
if ( ! $this->is_tax ) {
return false;
}
if ( empty( $taxonomy ) ) {
return true;
}
$queried_object = $this->get_queried_object();
$tax_array = array_intersect( array_keys( $wp_taxonomies ), (array) $taxonomy );
$term_array = (array) $term;
// Check that the taxonomy matches.
if ( ! ( isset( $queried_object->taxonomy ) && count( $tax_array ) && in_array( $queried_object->taxonomy, $tax_array, true ) ) ) {
return false;
}
// Only a taxonomy provided.
if ( empty( $term ) ) {
return true;
}
return isset( $queried_object->term_id ) &&
count(
array_intersect(
array( $queried_object->term_id, $queried_object->name, $queried_object->slug ),
$term_array
)
);
}
/**
* Determines whether the current URL is within the comments popup window.
*
* @since 3.1.0
* @deprecated 4.5.0
*
* @return false Always returns false.
*/
public function is_comments_popup() {
_deprecated_function( __FUNCTION__, '4.5.0' );
return false;
}
/**
* Determines whether the query is for an existing date archive.
*
* @since 3.1.0
*
* @return bool Whether the query is for an existing date archive.
*/
public function is_date() {
return (bool) $this->is_date;
}
/**
* Determines whether the query is for an existing day archive.
*
* @since 3.1.0
*
* @return bool Whether the query is for an existing day archive.
*/
public function is_day() {
return (bool) $this->is_day;
}
/**
* Determines whether the query is for a feed.
*
* @since 3.1.0
*
* @param string|string[] $feeds Optional. Feed type or array of feed types
* to check against. Default empty.
* @return bool Whether the query is for a feed.
*/
public function is_feed( $feeds = '' ) {
if ( empty( $feeds ) || ! $this->is_feed ) {
return (bool) $this->is_feed;
}
$qv = $this->get( 'feed' );
if ( 'feed' === $qv ) {
$qv = get_default_feed();
}
return in_array( $qv, (array) $feeds, true );
}
/**
* Determines whether the query is for a comments feed.
*
* @since 3.1.0
*
* @return bool Whether the query is for a comments feed.
*/
public function is_comment_feed() {
return (bool) $this->is_comment_feed;
}
/**
* Determines whether the query is for the front page of the site.
*
* This is for what is displayed at your site's main URL.
*
* Depends on the site's "Front page displays" Reading Settings 'show_on_front' and 'page_on_front'.
*
* If you set a static page for the front page of your site, this function will return
* true when viewing that page.
*
* Otherwise the same as {@see WP_Query::is_home()}.
*
* @since 3.1.0
*
* @return bool Whether the query is for the front page of the site.
*/
public function is_front_page() {
// Most likely case.
if ( 'posts' === get_option( 'show_on_front' ) && $this->is_home() ) {
return true;
} elseif ( 'page' === get_option( 'show_on_front' ) && get_option( 'page_on_front' )
&& $this->is_page( get_option( 'page_on_front' ) )
) {
return true;
} else {
return false;
}
}
/**
* Determines whether the query is for the blog homepage.
*
* This is the page which shows the time based blog content of your site.
*
* Depends on the site's "Front page displays" Reading Settings 'show_on_front' and 'page_for_posts'.
*
* If you set a static page for the front page of your site, this function will return
* true only on the page you set as the "Posts page".
*
* @since 3.1.0
*
* @see WP_Query::is_front_page()
*
* @return bool Whether the query is for the blog homepage.
*/
public function is_home() {
return (bool) $this->is_home;
}
/**
* Determines whether the query is for the Privacy Policy page.
*
* This is the page which shows the Privacy Policy content of your site.
*
* Depends on the site's "Change your Privacy Policy page" Privacy Settings 'wp_page_for_privacy_policy'.
*
* This function will return true only on the page you set as the "Privacy Policy page".
*
* @since 5.2.0
*
* @return bool Whether the query is for the Privacy Policy page.
*/
public function is_privacy_policy() {
if ( get_option( 'wp_page_for_privacy_policy' )
&& $this->is_page( get_option( 'wp_page_for_privacy_policy' ) )
) {
return true;
} else {
return false;
}
}
/**
* Determines whether the query is for an existing month archive.
*
* @since 3.1.0
*
* @return bool Whether the query is for an existing month archive.
*/
public function is_month() {
return (bool) $this->is_month;
}
/**
* Determines whether the query is for an existing single page.
*
* If the $page parameter is specified, this function will additionally
* check if the query is for one of the pages specified.
*
* @since 3.1.0
*
* @see WP_Query::is_single()
* @see WP_Query::is_singular()
*
* @param int|string|int[]|string[] $page Optional. Page ID, title, slug, path, or array of such
* to check against. Default empty.
* @return bool Whether the query is for an existing single page.
*/
public function is_page( $page = '' ) {
if ( ! $this->is_page ) {
return false;
}
if ( empty( $page ) ) {
return true;
}
$page_obj = $this->get_queried_object();
if ( ! $page_obj ) {
return false;
}
$page = array_map( 'strval', (array) $page );
if ( in_array( (string) $page_obj->ID, $page, true ) ) {
return true;
} elseif ( in_array( $page_obj->post_title, $page, true ) ) {
return true;
} elseif ( in_array( $page_obj->post_name, $page, true ) ) {
return true;
} else {
foreach ( $page as $pagepath ) {
if ( ! strpos( $pagepath, '/' ) ) {
continue;
}
$pagepath_obj = get_page_by_path( $pagepath );
if ( $pagepath_obj && ( $pagepath_obj->ID == $page_obj->ID ) ) {
return true;
}
}
}
return false;
}
/**
* Determines whether the query is for a paged result and not for the first page.
*
* @since 3.1.0
*
* @return bool Whether the query is for a paged result.
*/
public function is_paged() {
return (bool) $this->is_paged;
}
/**
* Determines whether the query is for a post or page preview.
*
* @since 3.1.0
*
* @return bool Whether the query is for a post or page preview.
*/
public function is_preview() {
return (bool) $this->is_preview;
}
/**
* Determines whether the query is for the robots.txt file.
*
* @since 3.1.0
*
* @return bool Whether the query is for the robots.txt file.
*/
public function is_robots() {
return (bool) $this->is_robots;
}
/**
* Determines whether the query is for the favicon.ico file.
*
* @since 5.4.0
*
* @return bool Whether the query is for the favicon.ico file.
*/
public function is_favicon() {
return (bool) $this->is_favicon;
}
/**
* Determines whether the query is for a search.
*
* @since 3.1.0
*
* @return bool Whether the query is for a search.
*/
public function is_search() {
return (bool) $this->is_search;
}
/**
* Determines whether the query is for an existing single post.
*
* Works for any post type excluding pages.
*
* If the $post parameter is specified, this function will additionally
* check if the query is for one of the Posts specified.
*
* @since 3.1.0
*
* @see WP_Query::is_page()
* @see WP_Query::is_singular()
*
* @param int|string|int[]|string[] $post Optional. Post ID, title, slug, path, or array of such
* to check against. Default empty.
* @return bool Whether the query is for an existing single post.
*/
public function is_single( $post = '' ) {
if ( ! $this->is_single ) {
return false;
}
if ( empty( $post ) ) {
return true;
}
$post_obj = $this->get_queried_object();
if ( ! $post_obj ) {
return false;
}
$post = array_map( 'strval', (array) $post );
if ( in_array( (string) $post_obj->ID, $post, true ) ) {
return true;
} elseif ( in_array( $post_obj->post_title, $post, true ) ) {
return true;
} elseif ( in_array( $post_obj->post_name, $post, true ) ) {
return true;
} else {
foreach ( $post as $postpath ) {
if ( ! strpos( $postpath, '/' ) ) {
continue;
}
$postpath_obj = get_page_by_path( $postpath, OBJECT, $post_obj->post_type );
if ( $postpath_obj && ( $postpath_obj->ID == $post_obj->ID ) ) {
return true;
}
}
}
return false;
}
/**
* Determines whether the query is for an existing single post of any post type
* (post, attachment, page, custom post types).
*
* If the $post_types parameter is specified, this function will additionally
* check if the query is for one of the Posts Types specified.
*
* @since 3.1.0
*
* @see WP_Query::is_page()
* @see WP_Query::is_single()
*
* @param string|string[] $post_types Optional. Post type or array of post types
* to check against. Default empty.
* @return bool Whether the query is for an existing single post
* or any of the given post types.
*/
public function is_singular( $post_types = '' ) {
if ( empty( $post_types ) || ! $this->is_singular ) {
return (bool) $this->is_singular;
}
$post_obj = $this->get_queried_object();
if ( ! $post_obj ) {
return false;
}
return in_array( $post_obj->post_type, (array) $post_types, true );
}
/**
* Determines whether the query is for a specific time.
*
* @since 3.1.0
*
* @return bool Whether the query is for a specific time.
*/
public function is_time() {
return (bool) $this->is_time;
}
/**
* Determines whether the query is for a trackback endpoint call.
*
* @since 3.1.0
*
* @return bool Whether the query is for a trackback endpoint call.
*/
public function is_trackback() {
return (bool) $this->is_trackback;
}
/**
* Determines whether the query is for an existing year archive.
*
* @since 3.1.0
*
* @return bool Whether the query is for an existing year archive.
*/
public function is_year() {
return (bool) $this->is_year;
}
/**
* Determines whether the query is a 404 (returns no results).
*
* @since 3.1.0
*
* @return bool Whether the query is a 404 error.
*/
public function is_404() {
return (bool) $this->is_404;
}
/**
* Determines whether the query is for an embedded post.
*
* @since 4.4.0
*
* @return bool Whether the query is for an embedded post.
*/
public function is_embed() {
return (bool) $this->is_embed;
}
/**
* Determines whether the query is the main query.
*
* @since 3.3.0
*
* @global WP_Query $wp_the_query WordPress Query object.
*
* @return bool Whether the query is the main query.
*/
public function is_main_query() {
global $wp_the_query;
return $wp_the_query === $this;
}
/**
* Sets up global post data.
*
* @since 4.1.0
* @since 4.4.0 Added the ability to pass a post ID to `$post`.
*
* @global int $id
* @global WP_User $authordata
* @global string $currentday
* @global string $currentmonth
* @global int $page
* @global array $pages
* @global int $multipage
* @global int $more
* @global int $numpages
*
* @param WP_Post|object|int $post WP_Post instance or Post ID/object.
* @return true True when finished.
*/
public function setup_postdata( $post ) {
global $id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages;
if ( ! ( $post instanceof WP_Post ) ) {
$post = get_post( $post );
}
if ( ! $post ) {
return;
}
$elements = $this->generate_postdata( $post );
if ( false === $elements ) {
return;
}
$id = $elements['id'];
$authordata = $elements['authordata'];
$currentday = $elements['currentday'];
$currentmonth = $elements['currentmonth'];
$page = $elements['page'];
$pages = $elements['pages'];
$multipage = $elements['multipage'];
$more = $elements['more'];
$numpages = $elements['numpages'];
/**
* Fires once the post data has been set up.
*
* @since 2.8.0
* @since 4.1.0 Introduced `$query` parameter.
*
* @param WP_Post $post The Post object (passed by reference).
* @param WP_Query $query The current Query object (passed by reference).
*/
do_action_ref_array( 'the_post', array( &$post, &$this ) );
return true;
}
/**
* Generates post data.
*
* @since 5.2.0
*
* @param WP_Post|object|int $post WP_Post instance or Post ID/object.
* @return array|false Elements of post or false on failure.
*/
public function generate_postdata( $post ) {
if ( ! ( $post instanceof WP_Post ) ) {
$post = get_post( $post );
}
if ( ! $post ) {
return false;
}
$id = (int) $post->ID;
$authordata = get_userdata( $post->post_author );
$currentday = false;
$currentmonth = false;
$post_date = $post->post_date;
if ( ! empty( $post_date ) && '0000-00-00 00:00:00' !== $post_date ) {
// Avoid using mysql2date for performance reasons.
$currentmonth = substr( $post_date, 5, 2 );
$day = substr( $post_date, 8, 2 );
$year = substr( $post_date, 2, 2 );
$currentday = sprintf( '%s.%s.%s', $day, $currentmonth, $year );
}
$numpages = 1;
$multipage = 0;
$page = $this->get( 'page' );
if ( ! $page ) {
$page = 1;
}
/*
* Force full post content when viewing the permalink for the $post,
* or when on an RSS feed. Otherwise respect the 'more' tag.
*/
if ( get_queried_object_id() === $post->ID && ( $this->is_page() || $this->is_single() ) ) {
$more = 1;
} elseif ( $this->is_feed() ) {
$more = 1;
} else {
$more = 0;
}
$content = $post->post_content;
if ( str_contains( $content, '' ) ) {
$content = str_replace( "\n\n", '', $content );
$content = str_replace( "\n", '', $content );
$content = str_replace( "\n", '', $content );
// Remove the nextpage block delimiters, to avoid invalid block structures in the split content.
$content = str_replace( '', '', $content );
$content = str_replace( '', '', $content );
// Ignore nextpage at the beginning of the content.
if ( str_starts_with( $content, '' ) ) {
$content = substr( $content, 15 );
}
$pages = explode( '', $content );
} else {
$pages = array( $post->post_content );
}
/**
* Filters the "pages" derived from splitting the post content.
*
* "Pages" are determined by splitting the post content based on the presence
* of `` tags.
*
* @since 4.4.0
*
* @param string[] $pages Array of "pages" from the post content split by `` tags.
* @param WP_Post $post Current post object.
*/
$pages = apply_filters( 'content_pagination', $pages, $post );
$numpages = count( $pages );
if ( $numpages > 1 ) {
if ( $page > 1 ) {
$more = 1;
}
$multipage = 1;
} else {
$multipage = 0;
}
$elements = compact( 'id', 'authordata', 'currentday', 'currentmonth', 'page', 'pages', 'multipage', 'more', 'numpages' );
return $elements;
}
/**
* Generates cache key.
*
* @since 6.1.0
*
* @global wpdb $wpdb WordPress database abstraction object.
*
* @param array $args Query arguments.
* @param string $sql SQL statement.
* @return string Cache key.
*/
protected function generate_cache_key( array $args, $sql ) {
global $wpdb;
unset(
$args['cache_results'],
$args['fields'],
$args['lazy_load_term_meta'],
$args['update_post_meta_cache'],
$args['update_post_term_cache'],
$args['update_menu_item_cache'],
$args['suppress_filters']
);
if ( empty( $args['post_type'] ) ) {
if ( $this->is_attachment ) {
$args['post_type'] = 'attachment';
} elseif ( $this->is_page ) {
$args['post_type'] = 'page';
} else {
$args['post_type'] = 'post';
}
} elseif ( 'any' === $args['post_type'] ) {
$args['post_type'] = array_values( get_post_types( array( 'exclude_from_search' => false ) ) );
}
$args['post_type'] = (array) $args['post_type'];
// Sort post types to ensure same cache key generation.
sort( $args['post_type'] );
if ( isset( $args['post_status'] ) ) {
$args['post_status'] = (array) $args['post_status'];
// Sort post status to ensure same cache key generation.
sort( $args['post_status'] );
}
// Add a default orderby value of date to ensure same cache key generation.
if ( ! isset( $q['orderby'] ) ) {
$args['orderby'] = 'date';
}
$placeholder = $wpdb->placeholder_escape();
array_walk_recursive(
$args,
/*
* Replace wpdb placeholders with the string used in the database
* query to avoid unreachable cache keys. This is necessary because
* the placeholder is randomly generated in each request.
*
* $value is passed by reference to allow it to be modified.
* array_walk_recursive() does not return an array.
*/
static function ( &$value ) use ( $wpdb, $placeholder ) {
if ( is_string( $value ) && str_contains( $value, $placeholder ) ) {
$value = $wpdb->remove_placeholder_escape( $value );
}
}
);
ksort( $args );
// Replace wpdb placeholder in the SQL statement used by the cache key.
$sql = $wpdb->remove_placeholder_escape( $sql );
$key = md5( serialize( $args ) . $sql );
$last_changed = wp_cache_get_last_changed( 'posts' );
if ( ! empty( $this->tax_query->queries ) ) {
$last_changed .= wp_cache_get_last_changed( 'terms' );
}
return "wp_query:$key:$last_changed";
}
/**
* After looping through a nested query, this function
* restores the $post global to the current post in this query.
*
* @since 3.7.0
*
* @global WP_Post $post Global post object.
*/
public function reset_postdata() {
if ( ! empty( $this->post ) ) {
$GLOBALS['post'] = $this->post;
$this->setup_postdata( $this->post );
}
}
/**
* Lazyloads term meta for posts in the loop.
*
* @since 4.4.0
* @deprecated 4.5.0 See wp_queue_posts_for_term_meta_lazyload().
*
* @param mixed $check
* @param int $term_id
* @return mixed
*/
public function lazyload_term_meta( $check, $term_id ) {
_deprecated_function( __METHOD__, '4.5.0' );
return $check;
}
/**
* Lazyloads comment meta for comments in the loop.
*
* @since 4.4.0
* @deprecated 4.5.0 See wp_lazyload_comment_meta().
*
* @param mixed $check
* @param int $comment_id
* @return mixed
*/
public function lazyload_comment_meta( $check, $comment_id ) {
_deprecated_function( __METHOD__, '4.5.0' );
return $check;
}
}
hema bestaat niet.','Sorry, you are not allowed to edit theme options on this site.'=>'Je hebt geen toestemming om thema opties te bewerken op deze site.','%1$s is deprecated. Use %2$s instead.'=>'%1$s is verouderd. Gebruik in plaats daarvan %2$s.','The post type %1$s is not registered, so it may not be reliable to check the capability %2$s against a post of that type.'=>'Het berichttype %1$s is niet geregistreerd, dus het zou niet betrouwbaar kunnen zijn om het recht %2$s te controleren tegen een bericht van dit type.','Clear Results'=>'Resultaten opschonen','The following formatting shortcuts are replaced when pressing Enter. Press Escape or the Undo button to undo.'=>'De volgende formattering snelkoppelingen worden vervangen wanneer je op Enter drukt. Druk op Escape of de "Ongedaan maken" knop om het ongedaan te maken.','Remove Menu Item: %1$s (%2$s)'=>'Menu-item verwijderen: %1$s (%2$s)','Hide password'=>'Wachtwoord verbergen','Show password'=>'Wachtwoord tonen','Menu Name'=>'Menunaam','Preview as an app icon'=>'Voorbeeld als een app icoon','Preview as a browser icon'=>'Voorbeeld als een browser icoon','No items'=>'Geen items','Registration confirmation will be emailed to you.'=>'Je ontvangt een bevestiging van je registratie per e-mail.','Show'=>'Tonen','password mismatchMismatch'=>'Verkeerde combinatie','password strengthStrong'=>'Sterk','password strengthWeak'=>'Zwak','password strengthVery weak'=>'Erg zwak','Add New Image'=>'Nieuwe afbeelding toevoegen','Add New Header Image'=>'Nieuwe kopafbeelding toevoegen','Hide image'=>'Afbeelding verbergen','Hide header image'=>'Verberg kopafbeelding','Site Icon'=>'Site icoon','Site Identity'=>'Site identiteit','Add to menu: %1$s (%2$s)'=>'Aan menu toevoegen: %1$s (%2$s)','When starting a new paragraph with one of these formatting shortcuts followed by a space, the formatting will be applied automatically. Press Backspace or Escape to undo.'=>'Bij het starten van een nieuwe paragraaf met één van de volgende formattering snelkoppelingen, gevolgd door een spatie, zal de formattering automatisch worden toegepast. Druk op Backspace of Escape om dit ongedaan te maken.','WordPress database error:'=>'WordPress databasefout:','To set your password, visit the following address:'=>'Bezoek het volgende adres om je wachtwoord in te stellen:','Username may not be longer than 60 characters.'=>'Gebruikersnaam mag niet langer zijn dan 60 tekens.','The called constructor method for %1$s class is deprecated since version %2$s! Use %3$s instead.'=>'De aangeroepen constructie methode voor de klasse %1$s is sinds versie %2$s verouderd!. Gebruik in plaats daarvan %3$s.','HTML tagPreformatted'=>'Gepreformatteerd','%1$s (%2$d)'=>'%1$s (%2$d)','Previewing theme'=>'Voorbeeld van thema aan het bekijken','Active theme'=>'Actief thema','Menus can be displayed in locations defined by your theme.'=>'Menu\'s kunnen weergegeven worden op locaties, gedefinieerd door je thema.','Menus can be displayed in locations defined by your theme or in widget areas by adding a “Navigation Menu” widget.'=>'Menu\'s kunnen weergegeven worden op locaties, gedefinieerd door je thema of in widget gebieden door het toevoegen van een “navigatie menu” widget.','Reorder mode closed'=>'Herschikmodus gesloten','Reorder mode enabled'=>'Herschikmodus ingeschakeld','Missing menu name.(unnamed)'=>'(naamloos)','When in reorder mode, additional controls to reorder menu items will be available in the items list above.'=>'In de herschikkingsmodus zijn er extra besturingen om items in het menu te herschikken beschikbaar in de lijst met items hierboven.','Close reorder mode'=>'Herschikmodus sluiten','Reorder menu items'=>'Menu-items herschikken','Add or remove menu items'=>'Menu-items toevoegen of verwijderen','Hi ###USERNAME###,
This notice confirms that your email address on ###SITENAME### was changed to ###NEW_EMAIL###.
If you did not change your email, please contact the Site Administrator at
###ADMIN_EMAIL###
This email has been sent to ###EMAIL###
Regards,
All at ###SITENAME###
###SITEURL###'=>'Hallo ###USERNAME###,
Dit bericht bevestigt dat je e-mailadres is gewijzigd op ###SITENAME###.
Als je het e-mailadres niet gewijzigd hebt, neem dan contact op met de sitebeheerder op
###ADMIN_EMAIL###
Deze e-mail is verzonden aan ###EMAIL###
Met vriendelijke groet,
Iedereen van ###SITENAME###
###SITEURL###','Hi ###USERNAME###,
This notice confirms that your password was changed on ###SITENAME###.
If you did not change your password, please contact the Site Administrator at
###ADMIN_EMAIL###
This email has been sent to ###EMAIL###
Regards,
All at ###SITENAME###
###SITEURL###'=>'Hallo ###USERNAME###,
Dit bericht bevestigt dat je wachtwoord is gewijzigd op ###SITENAME###.
Als je je wachtwoord niet gewijzigd hebt, neem dan contact op met de sitebeheerder op
###ADMIN_EMAIL###
Deze e-mail is verzonden naar ###EMAIL###
Met vriendelijke groet,
Iedereen van ###SITENAME###
###SITEURL###','No tags'=>'Geen tags','Attempting to parse a shortcode without a valid callback: %s'=>'Poging gedaan om een shortcode te verwerken zonder dat er een geldige callback was: %s','Close code tag'=>'Code-tag sluiten','Close list item tag'=>'Lijst item tag sluiten','List item'=>'Lijstitem','Close numbered list tag'=>'Genummerde lijsttag sluiten','Close bulleted list tag'=>'Lijsttag met opsommingstekens sluiten','Close inserted text tag'=>'Ingevoegde tekst tag sluiten','Inserted text'=>'Ingevoegde tekst','Close deleted text tag'=>'Tag verwijderde-tekst sluiten','Deleted text (strikethrough)'=>'Verwijderde tekst (doorgestreept)','Close blockquote tag'=>'Blockquote-tag sluiten','Close italic tag'=>'Cursief-tag sluiten','Close bold tag'=>'Vet-tag sluiten','mediaRemove video track'=>'Video-track verwijderen','Remove poster image'=>'Posterafbeelding verwijderen','Remove video source'=>'Videobron verwijderen','Remove audio source'=>'Audiobron verwijderen','Comma-separated list of replacement words in your language’tain’t,’twere,’twas,’tis,’twill,’til,’bout,’nuff,’round,’cause,’em'=>'’s ,’n ,’t','Comma-separated list of words to texturize in your language\'tain\'t,\'twere,\'twas,\'tis,\'twill,\'til,\'bout,\'nuff,\'round,\'cause,\'em'=>'\'s ,\'n ,\'t','Content:'=>'Inhoud:','Allow link notifications from other blogs (pingbacks and trackbacks) on new posts.'=>'Sta link meldingen van andere blogs (pingbacks en trackbacks) op nieuwe berichten toe.','Ctrl + letter:'=>'Ctrl + letter:','Cmd + letter:'=>'Cmd + letter:','Shift + Alt + letter:'=>'Shift + Alt + letter:','Ctrl + Alt + letter:'=>'Ctrl + Alt + letter:','Inline toolbar (when an image, link or preview is selected)'=>'Inline toolbar (als een afbeelding, link of voorbeeld is geselecteerd)','Additional shortcuts,'=>'Extra sneltoetsen,','Default shortcuts,'=>'Standaard sneltoetsen,','Customizing'=>'Aan het aanpassen','Menu Options'=>'Menu opties','Add to Menu'=>'Aan menu toevoegen','Custom Links'=>'Aangepaste links','The search results will be updated as you type.'=>'De zoekresultaten worden geüpdatet als je typt.','Search Menu Items'=>'Menu-items doorzoeken','Add Menu Items'=>'Menu-items toevoegen','Customizing ▸ %s'=>'Aan het aanpassen ▸ %s','Move one level down'=>'Eén niveau omlaag verplaatsen','Move one level up'=>'Eén niveau omhoog verplaatsen','Menu Locations'=>'Menulocaties','Your theme can display menus in %s location. Select which menu you would like to use.'=>'Je thema kan menu\'s in %s locatie tonen. Selecteer welk menu je wil gebruiken.' . "\0" . 'Je thema kan menu\'s op %s locaties tonen. Selecteer welk menu verschijnt op elke locatie.','This panel is used for managing navigation menus for content you have already published on your site. You can create menus and add items for existing content such as pages, posts, categories, tags, formats, or custom links.'=>'Dit paneel wordt gebruikt voor het beheren van navigatiemenu\'s voor inhoud die je al gepubliceerd hebt op de site. Je kunt menu\'s aanmaken en items voor bestaande inhoud toevoegen, zoals pagina\'s, berichten, categorieën, tags, formats of aangepaste links.','Out from under %s'=>'Weg van onder %s vandaan','Under %s'=>'Onder %s','Move out from under %s'=>'Verplaats van onder %s vandaan','Move under %s'=>'Verplaatst onder %s','Move to the top'=>'Verplaats naar bovenkant','Move down one'=>'Verplaats één omlaag','Move up one'=>'Eén naar boven verplaatsen','Loading more results... please wait.'=>'Meer resultaten laden... even geduld.','Additional items found: %d'=>'Aanvullende items gevonden: %d','Number of items found: %d'=>'Aantal gevonden items: %d','%s (Pending)'=>'%s (Wachtrij)','%s (Invalid)'=>'%s (Ongeldig)','Menu item is now a sub-item'=>'Menu-item is nu een sub-item','Menu item moved out of submenu'=>'Menu-item is uit het submenu verplaatst','Menu item moved down'=>'Menu-item is omlaag verplaatst','Menu item moved up'=>'Menu-item is omhoog verplaatst','Menu deleted'=>'Menu verwijderd','Menu created'=>'Menu aangemaakt','Menu item deleted'=>'Menu-item verwijderd','Menu item added'=>'Menu-item toegevoegd','nav menu home labelHome'=>'Home','Create Menu'=>'Menu aanmaken','Original: %s'=>'Origineel: %s','Link Relationship (XFN)'=>'Linkrelatie (XFN)','CSS Classes'=>'CSS-classes','Title Attribute'=>'Titelattribuut','Open link in a new tab'=>'Link openen in een nieuwe tab','Navigation Label'=>'Navigatielabel','Automatically add new top-level pages to this menu'=>'Automatisch hoofdniveau pagina\'s aan dit menu toevoegen','Menu Location'=>'Menu locatie','Delete Menu'=>'Menu verwijderen','Add Items'=>'Items toevoegen','User Dashboard: %s'=>'Gebruikersdashboard: %s','No %1$s was set in the arguments array for the "%2$s" sidebar. Defaulting to "%3$s". Manually set the %1$s to "%3$s" to silence this notice and keep existing sidebar content.'=>'Geen %1$s ingesteld voor de argumenten array voor de "%2$s" zijbalk. "%3$s" als standaard ingesteld. De %1$s naar "%3$s" handmatig instellen om dit bericht te verbergen en de bestaande inhoud van de zijbalk te behouden.','themeChange'=>'Veranderen','%1$s response to %2$s'=>'%1$s reactie op %2$s' . "\0" . '%1$s reacties op %2$s','Customizer'=>'Customizer','Could not split shared term.'=>'Gedeelde term kon niet gesplitst worden.','Taxonomy names must be between 1 and 32 characters in length.'=>'Taxonomienamen moeten tussen de 1 en 32 tekens lang zijn.','Site Preview'=>'Sitevoorbeeld','Post type names must be between 1 and 20 characters in length.'=>'Namen voor berichttypen moeten tussen de 1 en 20 karakters lang zijn.','revision date formatF j, Y @ H:i:s'=>'j F Y H:i:s','Custom Link'=>'Aangepaste link','Could not find site %1$s. Searched for table %2$s in database %3$s. Is that right?'=>'Kon site %1$s niet vinden. Gezocht in tabel %2$s in database %3$s. Klopt dat?','Database tables are missing. This means that your host’s database server is not running, WordPress was not installed properly, or someone deleted %s. You really should look at your database now.'=>'Database tabellen ontbreken. Dit betekent dat je host database server niet draait, WordPress niet goed is geïnstalleerd, of iemand heeft %s verwijderd. Je moet nu echt naar je database kijken.','Howdy USERNAME,
Your new account is set up.
You can log in with the following information:
Username: USERNAME
Password: PASSWORD
LOGINLINK
Thanks!
--The Team @ SITE_NAME'=>'Hallo USERNAME,
Je nieuwe account is aangemaakt.
Je kunt inloggen met de volgende gegevens:
Gebruikersnaam: USERNAME
Wachtwoord: PASSWORD
LOGINLINK
Bedankt.
--Het team van @ SITE_NAME','Howdy USERNAME,
Your new SITE_NAME site has been successfully set up at:
BLOG_URL
You can log in to the administrator account with the following information:
Username: USERNAME
Password: PASSWORD
Log in here: BLOG_URLwp-login.php
We hope you enjoy your new site. Thanks!
--The Team @ SITE_NAME'=>'Hallo USERNAME,
Je nieuwe site SITE_NAME is klaar voor je op:
BLOG_URL
Je kunt nu inloggen met het beheerdersaccount met de volgende informatie:
Gebruikersnaam: USERNAME
Wachtwoord: PASSWORD
Log hier in: BLOG_URLwp-login.php
We hopen dat je plezier beleeft met je nieuwe site. Bedankt.
--Het team van SITE_NAME','Drag and drop to reorder media files.'=>'Verslepen om mediabestanden opnieuw te ordenen.','Detach'=>'Losmaken','The %1$s option is deprecated for the family of %2$s functions. Use the %3$s function instead.'=>'De %1$s optie is verouderd voor de familie van %2$s functies. Gebruik in plaats daarvan de %3$s functie.','The %1$s option is deprecated for the family of %2$s functions. Use the %3$s option instead.'=>'De %1$s optie is verouderd voor de familie van %2$s functies. Gebruik in plaats daarvan de %3$s optie.','Select Post'=>'Bericht selecteren','Select Week'=>'Week selecteren','Select Day'=>'Dag selecteren','Select Year'=>'Jaar selecteren','Comments Off on %s'=>'Reacties uitgeschakeld voor %s','%1$s Comment on %2$s'=>'%1$s reactie op %2$s' . "\0" . '%1$s reacties op %2$s','1 Comment on %s'=>'1 reactie op %s','No Comments on %s'=>'Geen reacties op %s','Link Text'=>'Linktekst','Live Preview'=>'Live voorbeeld','themePreviewing:'=>'Voorbeeld:','Theme Details'=>'Themadetails','No categories found.'=>'Geen categorieën gevonden.','Distraction-free writing mode'=>'Afleidingsvrije modus','Theme support for %1$s should be registered before the %2$s hook.'=>'Thema ondersteuning voor %1$s moet geregistreerd worden voor de hook %2$s.','Widget moved down'=>'Widget omlaag verplaatsen','Widget moved up'=>'Widget omhoog verplaatsen','To move focus to other buttons use Tab or the arrow keys. To return focus to the editor press Escape or use one of the buttons.'=>'Maak gebruik van Tab of de pijltoetsen om de focus naar andere knoppen te verplaatsen. Druk op Escape of maak gebruik van één van de knoppen om de focus terug te krijgen op de editor.','Elements path'=>'Element-pad','Editor toolbar'=>'Editor toolbar','Editor menu (when enabled)'=>'Editor-menu (indien ingeschakeld)','Focus shortcuts:'=>'Focus-sneltoets:','Rich Text Area. Press Alt-Shift-H for help.'=>'Rich Text gebied. Druk op Alt-Shift-H voor hulp.','The following values do not describe a valid date: month %1$s, day %2$s.'=>'De volgende waarde beschrijft geen geldige datum: dag %2$s, maand %1$s.','%s must set a database connection for use with escaping.'=>'%s moet een databaseconnectie instellen voor het gebruik van \'escaping\'.','You need to pass an array of types.'=>'Je moet een array van types meegeven.','A term with the name provided already exists in this taxonomy.'=>'Een term met deze naam en slug bestaat al in deze taxonomie.','You can see all comments on this post here:'=>'Hier kun je alle reacties op dit bericht zien:','You can see all pingbacks on this post here:'=>'Hier kun je alle pingbacks op dit bericht zien:','You can see all trackbacks on this post here:'=>'Hier kun je alle trackbacks op dit bericht zien:','Comment: %s'=>'Reactie: %s','URL: %s'=>'URL: %s','nounTrash'=>'Prullenbak','Edit Selection'=>'Selectie bewerken','verbTrash'=>'Prullenbak','Previous'=>'Vorige','Posts navigation'=>'Berichten navigatie','Newer posts'=>'Nieuwere berichten','Older posts'=>'Oudere berichten','translationsAvailable'=>'Beschikbaar','translationsInstalled'=>'Geïnstalleerd','post format archive titleChats'=>'Gesprekken','post format archive titleAudio'=>'Audio','post format archive titleStatuses'=>'Statussen','post format archive titleLinks'=>'Links','post format archive titleQuotes'=>'Citaten','post format archive titleVideos'=>'Video\'s','post format archive titleImages'=>'Afbeeldingen','post format archive titleGalleries'=>'Galerijen','post format archive titleAsides'=>'Asides','daily archives date formatF j, Y'=>'j F Y','Author: %s'=>'Auteur: %s','The following values do not describe a valid date: year %1$s, month %2$s, day %3$s.'=>'De volgende waarden beschrijven geen geldige datum: dag %3$s, maand %2$s, jaar %1$s.','Invalid value %1$s for %2$s. Expected value should be between %3$s and %4$s.'=>'Ongeldige waarde %1$s voor %2$s. Verwachte waarde moet liggen tussen %3$s en %4$s.','Reply to %s'=>'Antwoord op %s','No alignment'=>'Geen uitlijning','vertical table cell alignmentV Align'=>'V-uitlijning','horizontal table cell alignmentH Align'=>'H-uitlijning','Border color'=>'Randkleur','Add to Dictionary'=>'Aan woordenboek toevoegen','No color'=>'Geen kleur','label for custom colorCustom...'=>'Aangepast...','Custom color'=>'Aangepaste kleur','Color'=>'Kleur','No image selected'=>'Geen afbeelding geselecteerd','Select image'=>'Afbeelding selecteren','Choose file'=>'Kies bestand','No file selected'=>'Geen bestand geselecteerd','Change file'=>'Wijzig bestand','post type general nameMedia'=>'Media','add new from admin barPage'=>'Pagina','add new from admin barPost'=>'Bericht','TinyMCE menuFormat'=>'Format','list styleDefault'=>'Standaard','add new from admin barLink'=>'Link','You have successfully updated WordPress! Please log back in to see what’s new.'=>'Je hebt WordPress succesvol geüpdatet! Log opnieuw in om te zien wat er nieuw is.','You are about to trash these items.
\'Cancel\' to stop, \'OK\' to delete.'=>'Je staat op het punt deze items te verwijderen.
\'Annuleren\' om te stoppen, \'OK\' om te verwijderen.','Bulk select'=>'Bulkselectie','%s: %l.'=>'%s: %l.','missing menu item navigation label(no label)'=>'(geen label)','This site is no longer available.'=>'Deze site is niet langer beschikbaar.','Search media'=>'Media zoeken','Filter by type'=>'Op type filteren','Filter by date'=>'Op datum filteren','All dates'=>'Alle datums','Bitrate Mode'=>'Bitrate modus','Bitrate'=>'Bitrate','Edit more details'=>'Overige details bewerken','View attachment page'=>'Pagina met bijlage bekijken','Uploaded to:'=>'Geüpload naar:','Uploaded by:'=>'Geüpload door:','Bitrate:'=>'Bitrate:','Dimensions:'=>'Afmetingen:','File size:'=>'Bestandsgrootte:','Uploaded on:'=>'Geüpload op:','File type:'=>'Bestandstype:','File name:'=>'Bestandsnaam:','Edit next media item'=>'Volgend media-item bewerken','Edit previous media item'=>'Vorig media-item bewerken','Maximum upload file size: %s.'=>'Maximale bestandsgrootte van upload: %s.','Close uploader'=>'Uploader sluiten','Search or use up and down arrow keys to select an item.'=>'Zoek of gebruik de pijltoetsen omhoog en omlaag om een item te selecteren.','Read more...'=>'Verder lezen...','Your browser does not support direct access to the clipboard. Please use keyboard shortcuts or your browser’s edit menu instead.'=>'Je browser ondersteunt geen directe toegang tot het klembord. Gebruik in plaats daarvan toetscombinaties of het menu Bewerken van de browser.','Widgets are independent sections of content that can be placed into widgetized areas provided by your theme (commonly called sidebars).'=>'Widgets zijn onafhankelijke secties met inhoud die in de widget gebieden van je thema geplaatst kunnen worden (gewoonlijk zijbalken genoemd).','You are customizing %s'=>'Je bent %s aan het aanpassen','Error: The comment could not be saved. Please try again later.'=>'Fout: de reactie kon niet worden opgeslagen. Probeer het later nog eens.','(WordPress could not establish a secure connection to WordPress.org. Please contact your server administrator.)'=>'(WordPress kon geen beveiligde verbinding maken met WordPress.org. Neem contact op met je serverbeheerder.)','Shift-click to edit this widget.'=>'Shift-klik om deze widget te bewerken.','HTML tagAddress'=>'Adres','If you are looking to paste rich content from Microsoft Word, try turning this option off. The editor will clean up text pasted from Word automatically.'=>'Als je rich content uit Microsoft Word wil plakken, probeer deze optie dan uit te zetten. De editor zal de tekst die vanuit Word wordt geplakt automatisch opschonen.','Keyboard Shortcuts'=>'Toetscombinaties','Error: Cookies are blocked or not supported by your browser. You must enable cookies to use WordPress.'=>'Fout: cookies worden geblokkeerd of niet ondersteund door je browser. Je moet cookies inschakelen om WordPress te kunnen gebruiken.','Error: Cookies are blocked due to unexpected output. For help, please see this documentation or try the support forums.'=>'Fout: cookies zijn geblokkeerd vanwege onverwachte uitvoer. Zie voor hulp deze documentatie of probeer de ondersteuningsforums.','Add to Audio Playlist'=>'Aan audio-afspeellijst toevoegen','Add to audio playlist'=>'Aan audio-afspeellijst toevoegen','Update audio playlist'=>'Audio-afspeellijst updaten','Insert audio playlist'=>'Audio-afspeellijst invoegen','← Cancel audio playlist'=>'← Audio-afspeellijst annuleren','Edit audio playlist'=>'Audio-afspeellijst bewerken','There has been an error cropping your image.'=>'Er is een fout opgetreden bij het bijsnijden van je afbeelding.','video or audioLength'=>'Duur','Year'=>'Jaar','Genre'=>'Genre','Album'=>'Album','Artist'=>'Artiest','Link CSS Class'=>'Link CSS-class','Image CSS Class'=>'CSS-klasse afbeelding','Image Title Attribute'=>'Attribuut afbeeldingstitel','Advanced Options'=>'Geavanceerde instellingen','Custom Size'=>'Aangepaste afmetingen','Display Settings'=>'Weergave instellingen','Edit Original'=>'Origineel bewerken','Show Video List'=>'Videolijst tonen','table cell alignment attributeNone'=>'Geen','Split table cell'=>'Tabelcellen splitsen','Font Sizes'=>'Lettertype grootte','Font Family'=>'Lettertype familie','TinyMCEHeadings'=>'Kopteksten','Search Widgets'=>'Widgets zoeken','Save and preview changes before publishing them.'=>'Wijzigingen opslaan en bekijken voor het publiceren.','Move widgetMove'=>'Verplaatsen','Set image'=>'Afbeelding instellen','auto preloadAuto'=>'Automatisch','Cropping…'=>'Bijsnijden…','Tracks (subtitles, captions, descriptions, chapters, or metadata)'=>'Sporen (ondertiteling, bijschriften, beschrijvingen, hoofdstukken of metadata)','Move to another area…'=>'Naar ander gebied verplaatsen…','TinyMCE menuTable'=>'Tabel','TinyMCE menuView'=>'Bekijken','TinyMCE menuTools'=>'Gereedschap','TinyMCE menuEdit'=>'Bewerken','TinyMCE menuFile'=>'Bestand','TinyMCE menuInsert'=>'Invoegen','Words: %s'=>'Woorden: %s','editor buttonShow blocks'=>'Toon blokken','TinyMCETemplates'=>'Templates','TinyMCEInsert template'=>'Template invoegen','table cell scope attributeScope'=>'Bereik','table footerFooter'=>'Footer','table bodyBody'=>'Body','table headerHeader'=>'Header','table cellCell'=>'Cel','spellcheckIgnore'=>'Negeren','spellcheckIgnore all'=>'Alles negeren','spellcheckFinish'=>'Afronden','find/replaceReplace all'=>'Alles vervangen','find/replaceFind'=>'Vind','find/replaceReplace with'=>'Vervangen door','find/replaceWhole words'=>'Volledige woorden','find/replacePrev'=>'Vorige','find/replaceNext'=>'Volgende','find/replaceReplace'=>'Vervangen','editor buttonLeft to right'=>'Van links naar rechts','editor buttonRight to left'=>'Van rechts naar links','Link anchors (TinyMCE)Anchors'=>'Ankers','Link anchor (TinyMCE)Anchor'=>'Anker','Name of link anchor (TinyMCE)Name'=>'Naam','list styleLower Roman'=>'Klein Romeins','list styleUpper Roman'=>'Groot Romeins','list styleUpper Alpha'=>'Hoofdletter alfabetisch','list styleLower Alpha'=>'Alfabetisch','list styleLower Greek'=>'Klein Grieks','list styleDisc'=>'Schijf','list styleCircle'=>'Cirkel','list styleSquare'=>'Vierkant','Bulleted list'=>'Opsommingslijst','HTML elementsInline'=>'Inline','HTML tagPre'=>'Pre','HTML tagDiv'=>'Div','TinyMCEBlocks'=>'Blokken','TinyMCEFormats'=>'Formats','Add alternate sources for maximum HTML5 playback'=>'Alternatieve bronnen toevoegen voor betere HTML5-ondersteuning','Hint: The password should be at least twelve characters long. To make it stronger, use upper and lower case letters, numbers, and symbols like ! " ? $ % ^ & ).'=>'Hint: het wachtwoord moet minimaal twaalf tekens lang zijn. Gebruik hoofd- en kleine letters, cijfers en tekens zoals ! " ? $ % ^ & ) om het sterker te maken.','The query argument of %s must have a placeholder.'=>'Het query argument van %s moet een plaatshouder hebben.','Invalid menu ID.'=>'Ongeldig menu ID.','Add to video Playlist'=>'Aan video-afspeellijst toevoegen','Add to video playlist'=>'Aan video-afspeellijst toevoegen','Update video playlist'=>'Video-afspeellijst updaten','Insert video playlist'=>'Video-afspeellijst invoegen','← Cancel video playlist'=>'← Video-afspeellijst annuleren','Edit video playlist'=>'Video-afspeellijst bewerken','Create video playlist'=>'Video-afspeellijst aanmaken','Drag and drop to reorder videos.'=>'Verslepen om video\'s opnieuw te ordenen.','Create audio playlist'=>'Audio-afspeellijst aanmaken','Drag and drop to reorder tracks.'=>'Tracks verslepen om te herschikken.','Add subtitles'=>'Ondertiteling toevoegen','Add video source'=>'Videobron toevoegen','Replace video'=>'Video vervangen','Video details'=>'Videodetails','Add audio source'=>'Audiobron toevoegen','Replace audio'=>'Audio vervangen','Audio details'=>'Audiodetails','Crop your image'=>'Je afbeelding bijsnijden','Crop image'=>'Afbeelding bijsnijden','Skip cropping'=>'Bijsnijden overslaan','Select and crop'=>'Selecteren en bijsnijden','Cancel edit'=>'Bewerken annuleren','Image details'=>'Afbeeldingsdetails','Create a new video playlist'=>'Een nieuwe video-afspeellijst aanmaken','Create a new playlist'=>'Een nieuwe afspeellijst aanmaken','Back'=>'Terug','There are no associated subtitles.'=>'Geen ondertitels beschikbaar.','Poster Image'=>'Posterafbeelding','Autoplay'=>'Automatisch afspelen','Metadata'=>'Metadata','Show Images'=>'Afbeeldingen weergeven','Show Artist Name in Tracklist'=>'Artiest weergeven in afspeellijst','Show Tracklist'=>'Afspeellijst weergeven','Playlist Settings'=>'Afspeellijst instellingen','Search widgetSearch'=>'Zoeken','Insert Read More tag'=>'Verder lezen tag invoegen','Toolbar Toggle'=>'Toolbar toggle','Tools'=>'Gereedschap','Show invisible characters'=>'Onzichtbare karakters weergeven','Text color'=>'Tekstkleur','Background color'=>'Achtergrondkleur','Delete column'=>'Kolom verwijderen','Row group'=>'Rijgroep','Cell type'=>'Celtype','Header cell'=>'Header cel','Insert table'=>'Tabel invoegen','Row type'=>'Rijtype','Cell spacing'=>'Celspatie','Cell padding'=>'Cel padding','Column group'=>'Kolomgroep','Rows'=>'Rijen','Finnish'=>'Fins','Match case'=>'Hoofdlettergevoelig','Find and replace'=>'Zoeken en vervangen','Replace'=>'Vervangen','Could not find the specified string.'=>'Kon de opgegeven string niet vinden.','Paste as text'=>'Plakken als tekst','Page break'=>'Pagina-einde','Nonbreaking space'=>'Niet brekende ruimte','Embed'=>'Insluiten','Insert video'=>'Video toevoegen','Paste your embed code below:'=>'Plak je insluitcode hieronder:','Alternative source'=>'Alternatieve bron','New window'=>'Nieuw venster','Text to display'=>'Te tonen tekst','Insert date/time'=>'Datum/tijd invoegen','Insert image'=>'Afbeelding invoegen','Style'=>'Stijl','Horizontal line'=>'Horizontale lijn','Encoding'=>'Codering','Keywords'=>'Keywords','Robots'=>'Robots','Emoticons'=>'Emoticons','Source code'=>'Broncode','Special character'=>'Speciaal karakter','Restore last draft'=>'Laatste concept terugzetten','Visual aids'=>'Visuele ondersteuning','Align left'=>'Links uitlijnen','Justify'=>'Uitvullen','Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.'=>'Plakken staat nu in de modus platte tekst. Inhoud wordt nu als platte tekst geplakt totdat je deze optie toggle uit.','Decrease indent'=>'Inspringen verkleinen','Align center'=>'Centreren','Clear formatting'=>'Opmaak verwijderen','Block'=>'Blok','Increase indent'=>'Inspringen vergroten','Numbered list'=>'Genummerde lijst','Align right'=>'Rechts uitlijnen','An error has occurred. Please reload the page and try again.'=>'Er is een fout opgetreden. Laad de pagina opnieuw en probeer het opnieuw.','Select an area to move this widget into:'=>'Selecteer een gebied waar je deze widget naartoe wilt verplaatsen:','Move up'=>'Omhoog verplaatsen','Move down'=>'Omlaag verplaatsen','Reorder'=>'Herschikken','Add a Widget'=>'Widget toevoegen','custom headersSuggested'=>'Aangeraden','custom headersPreviously uploaded'=>'Eerder geüpload','Current header'=>'Huidige header','No image set'=>'Geen afbeelding ingesteld','Randomizing suggested headers'=>'Aangeraden headers willekeurig weergeven','Randomizing uploaded headers'=>'Geüploade headers willekeurig weergeven','Randomize suggested headers'=>'Aangeraden headers willekeurig weergeven','Randomize uploaded headers'=>'Geüploade headers willekeurig weergeven','https://wordpress.org/support/forum/requests-and-feedback'=>'https://wordpress.org/support/forum/requests-and-feedback','Change'=>'Wijzigen','Status'=>'Status','admin color schemeCoffee'=>'Koffie','admin color schemeOcean'=>'Oceaan','admin color schemeEctoplasm'=>'Ectoplasma','admin color schemeSunrise'=>'Zonsopkomst','Attempted to set image quality outside of the range [1,100].'=>'Geprobeerd de afbeeldingskwaliteit buiten het bereik [1 tot 100] in te stellen.','A cloud of your most used tags.'=>'Een cloud van je meest gebruikte tags.','Entries from any RSS or Atom feed.'=>'Berichten van RSS- of Atom-feed.','Your site’s most recent comments.'=>'De meest recente reacties op je site.','Your site’s most recent Posts.'=>'De meest recente berichten op je site.','A list or dropdown of categories.'=>'Een lijst of dropdown met categorieën.','Login, RSS, & WordPress.org links.'=>'Login, RSS, & WordPress.org links.','A monthly archive of your site’s Posts.'=>'Een maandelijks archief van je berichten op deze site.','A search form for your site.'=>'Een zoekformulier voor je site.','A list of your site’s Pages.'=>'Een lijst van de pagina\'s op je site.','An unexpected error occurred. Something may be wrong with WordPress.org or this server’s configuration. If you continue to have problems, please try the support forums.'=>'Er is een onverwachte fout opgetreden. Er is mogelijk iets mis met WordPress.org of de configuratie van deze server. Als je problemen blijft ondervinden, probeer dan de ondersteuningsforums.','Open Sans font: add new subset (greek, cyrillic, vietnamese)no-subset'=>'no-subset','Use commas instead of %s to separate excluded terms.'=>'Gebruik komma\'s in plaats van %s om termen uit te sluiten.','admin color schemeMidnight'=>'Middernacht','admin color schemeLight'=>'Licht','admin color schemeDefault'=>'Standaard','Menu'=>'Menu','Translation Updates'=>'Vertalingsupdates','The theme directory "%s" does not exist.'=>'De thema folder "%s" bestaat niet.','Comma-separated list of search stopwords in your languageabout,an,are,as,at,be,by,com,for,from,how,in,is,it,of,on,or,that,the,this,to,was,what,when,where,who,will,with,www'=>'over,een,zoals,op,zijn,door,com,voor,hoe,in,is,het,van,op,of,dat,de,dit,naar,was,wat,wanneer,waar,wie,zal,met,www','This content is password protected. To view it please enter your password below:'=>'Deze inhoud is beschermd met een wachtwoord. Voer hieronder je wachtwoord in om het te bekijken:','Failed to write request to temporary file.'=>'Het is niet gelukt om de aanvraag op te slaan in een tijdelijk bestand.','The SSL certificate for the host could not be verified.'=>'Het SSL-certificaat voor de host kon niet geverifieerd worden.','Embed Media Player'=>'Mediaspeler insluiten','Link to Attachment Page'=>'Link naar bijlagepagina','Link to Media File'=>'Link naar mediabestand','Embed or Link'=>'Insluiten of linken','Length:'=>'Lengte:','Captions/Subtitles'=>'Bijschriften/ondertitels','Unmute'=>'Geluid aan','Download File'=>'Bestand downloaden','Invalid'=>'Ongeldig','%s year'=>'%s jaar' . "\0" . '%s jaar','%s month'=>'%s maand' . "\0" . '%s maanden','%s week'=>'%s week' . "\0" . '%s weken','#%d (no title)'=>'#%d (geen titel)','JavaScript must be enabled to use this feature.'=>'Deze functie werkt alleen als JavaScript is ingeschakeld.','g:i a'=>'H:i','The URL to the admin area'=>'De URL naar het beheergebied','Login Address (URL)'=>'Login adres (URL)','The web browser on your device cannot be used to upload files. You may be able to use the native app for your device instead.'=>'De webbrowser op je apparaat kan geen bestanden uploaden. Mogelijk is de native app voor je apparaat een betere keuze.','Error: Could not register you… please contact the site admin!'=>'Fout: kon je niet registreren… neem contact op met de sitebeheerder!','(more…)'=>'(meer…)','The site you were looking for, %s, does not exist, but you can create it now!'=>'De site waar je naar zocht, %s, bestaat niet maar je kan hem nu aanmaken!','Have you entered your email correctly? You have entered %s, if it’s incorrect, you will not receive your email.'=>'Heb je je e-mailadres correct ingevoerd? Je hebt %s ingevoerd, als het onjuist is, zul je je e-mail niet ontvangen.','The login page will open in a new tab. After logging in you can close it and return to this page.'=>'De login pagina wordt in een nieuwe tab geopend. Na het inloggen kun je dat sluiten en naar deze pagina terugkeren.','%s says:'=>'%s schreef:','submit buttonSearch'=>'Zoeken','labelSearch for:'=>'Zoeken naar:','placeholderSearch …'=>'Zoeken …','Session expired'=>'Sessie verlopen','No tags found.'=>'Geen tags gevonden.','Do not deregister the %1$s script in the administration area. To target the front-end theme, use the %2$s hook.'=>'Schakel het %1$s script niet uit in het beheergebied. Om het front-end thema te benaderen maak je gebruik van de %2$s hook.','Site Address (URL)'=>'Site adres (URL)','WordPress Address (URL)'=>'WordPress adres (URL)','Invalid user ID.'=>'Ongeldig gebruikers-ID.','Random Order'=>'Willekeurige volgorde','Insert from URL'=>'Invoegen via URL','%d selected'=>'%d geselecteerd','Links widgetRandom'=>'Willekeurig','No items found.'=>'Geen items gevonden.','Reverse order'=>'Volgorde omkeren','Deselect'=>'Deselecteren','Delete permanently'=>'Permanent verwijderen','Upload Limit Exceeded'=>'Upload beperking overschreden','Dismiss errors'=>'Fouten negeren','Uploading'=>'Uploaden','No editor could be selected.'=>'Er kon geen editor worden geselecteerd.','Video (%s)'=>'Video (%s)' . "\0" . 'Video (%s)','Manage Video'=>'Beheer Video','Video'=>'Video','Audio (%s)'=>'Audio (%s)' . "\0" . 'Audio (%s)','Manage Audio'=>'Audio beheren','Image (%s)'=>'Afbeelding (%s)' . "\0" . 'Afbeeldingen (%s)','Manage Images'=>'Afbeeldingen beheren','Uploaded to this page'=>'Geüpload naar deze pagina','Insert into page'=>'In pagina invoegen','Audio'=>'Audio','Uploaded to this post'=>'Geüpload naar dit bericht','All media items'=>'Alle media items','Custom URL'=>'Aangepaste URL','Columns'=>'Kolommen','Alt Text'=>'Alt-tekst','Attachment Details'=>'Bijlagedetails','Large'=>'Groot','← Cancel gallery'=>'← Galerij annuleren','Upload images'=>'Afbeeldingen uploaden','Gallery Settings'=>'Galerij instellingen','Attachment Display Settings'=>'Weergave instellingen bijlagen','WordPress › Success'=>'WordPress › succes','Upload files'=>'Bestanden uploaden','Insert gallery'=>'Galerij invoegen','Drop files to upload'=>'Sleep bestanden om te uploaden','Create gallery'=>'Galerij aanmaken','Media Library'=>'Mediabibliotheek','You appear to have already installed WordPress. To reinstall please clear your old database tables first.'=>'Het lijkt erop dat je WordPress al hebt geïnstalleerd. Om opnieuw te installeren, moet je eerst je oude databasetabellen wissen.','Already Installed'=>'Reeds geïnstalleerd','To activate your user, please click the following link:
%s
After you activate, you will receive *another email* with your login.'=>'Om je gebruiker te activeren, klik op de volgende link:
%s
Na je activatie, ontvang je *nog een e-mail* met je login.','New User: %1$s
Remote IP address: %2$s
Disable these notifications: %3$s'=>'Nieuwe gebruiker: %1$s
Extern IP-adres: %2$s
Deze meldingen uitschakelen: %3$s','New Site: %1$s
URL: %2$s
Remote IP address: %3$s
Disable these notifications: %4$s'=>'Nieuwe site %1$s
URL: %2$s
Extern IP-adres: %3$s
Deze meldingen uitschakelen: %4$s','Media File'=>'Mediabestand','Attachment Page'=>'Bijlagepagina','Link To'=>'Link naar','Update gallery'=>'Galerij updaten','Error: This username is already registered. Please choose another one.'=>'Fout: deze gebruikersnaam is al geregistreerd. Kies een andere.','Please enter a valid email address.'=>'Geef een geldig e-mailadres op.','The requested user does not exist.'=>'De opgevraagde gebruiker bestaat niet.','Image Editor Save Failed'=>'Afbeelding editor opslaan mislukt','Image flip failed.'=>'Spiegelen afbeelding mislukt.','Image rotate failed.'=>'Roteren afbeelding mislukt.','Image crop failed.'=>'Bijsnijden afbeelding mislukt.','Image resize failed.'=>'Afbeelding formaat aanpassen mislukt.','Could not read image size.'=>'Kon afbeeldingsgrootte niet lezen.','File is not an image.'=>'Bestand is geen afbeelding.','Display name based on first name and last name%1$s %2$s'=>'%1$s %2$s','Could not insert term relationship into the database.'=>'Kon de term relatie niet in de database invoegen.','Clear'=>'Wissen','Add to gallery'=>'Aan galerij toevoegen','Insert into post'=>'In bericht invoegen','Create a new gallery'=>'Een nieuwe galerij aanmaken','View Attachment Page'=>'Pagina met bijlage bekijken','Select Files'=>'Bestanden selecteren','Uploader: Drop files here - or - Select Filesor'=>'of','Alternative Text'=>'Alternatieve tekst','%1$s %2$s %3$s Feed'=>'%1$s %2$s %3$s feed','Display post date?'=>'Toon berichtdatum?','Sorry, you are not allowed to create pages as this user.'=>'Je hebt geen toestemming om pagina\'s aan te maken als deze gebruiker.','Sorry, revisions are disabled.'=>'Revisies zijn uitgeschakeld.','Sorry, you are not allowed to edit posts.'=>'Je hebt geen toestemming om berichten te bewerken.','Sorry, the user could not be updated.'=>'De gebruiker kon niet worden geüpdatet.','There is a revision of this post that is more recent.'=>'Er is een recentere revisie van dit bericht aanwezig.','Incorrect username or password.'=>'Ongeldig(e) gebruikersnaam of wachtwoord.','XML-RPC services are disabled on this site.'=>'XML-RPC diensten zijn uitgeschakeld voor deze site.','Name for the Text editor tab (formerly HTML)Text'=>'Tekst','Skip to toolbar'=>'Spring naar toolbar','Header Text Color'=>'Header tekstkleur','Colors'=>'Kleuren','Saved'=>'Opgeslagen','Save & Publish'=>'Opslaan & publiceren','Select file'=>'Bestand selecteren','Customize'=>'Customizer','Insufficient arguments passed to this XML-RPC method.'=>'Onvoldoende argumenten doorgegeven aan deze XML-RPC methode.','Sorry, you cannot stick a private post.'=>'Je kunt een privébericht niet sticky maken.','Sorry, you are not allowed to publish this page.'=>'Je hebt geen toestemming om deze pagina te publiceren.','Header Image'=>'Kopafbeelding','Post Thumbnail'=>'Bericht thumbnail','Toggle Editor Text Direction'=>'Toggle editor tekstrichting','text direction'=>'tekstrichting','Please enter a site title.'=>'Een sitetitel invoeren.','Site name must be at least %s character.'=>'Sitenaam moet minimaal %s teken lang zijn.' . "\0" . 'Sitenaam moet minimaal %s tekens lang zijn.','That name is not allowed.'=>'Deze naam is niet toegestaan.','Please enter a site name.'=>'Een sitenaam invoeren.','Username must be at least 4 characters.'=>'Gebruikersnaam moet minimaal 4 tekens lang zijn.','Please enter a username.'=>'Een gebruikersnaam invoeren.','A static page'=>'Een statische pagina','Background Image'=>'Achtergrondafbeelding','Background Color'=>'Achtergrondkleur','Change image'=>'Afbeelding wijzigen','Remove image'=>'Afbeelding verwijderen','Sorry, you are not allowed to edit this comment.'=>'Je hebt geen toestemming om deze reactie te bewerken.','Posts page'=>'Berichtenpagina','Allowed Files'=>'Toegestane bestanden','Remove'=>'Verwijderen','Upload'=>'Uploaden','Sorry, you are not allowed to assign terms in this taxonomy.'=>'Je hebt geen toestemming om termen toe te wijzen in deze taxonomie.','Sorry, deleting the term failed.'=>'Verwijderen van de term is mislukt.','Sorry, you are not allowed to manage terms in this taxonomy.'=>'Je hebt geen toestemming om termen te beheren in deze taxonomie.','Sorry, editing the term failed.'=>'Het bewerken van de term is mislukt.','Invalid term ID.'=>'Ongeldig term-ID.','Sorry, you are not allowed to edit terms in this taxonomy.'=>'Je hebt geen toestemming om de termen te bewerken in deze taxonomie.','Parent term does not exist.'=>'Hoofdterm bestaat niet.','This taxonomy is not hierarchical.'=>'Deze taxonomie is niet hiërarchisch.','The term name cannot be empty.'=>'De termnaam kan niet leeg zijn.','Sorry, you are not allowed to create terms in this taxonomy.'=>'Je hebt geen toestemming om termen aan te maken in deze taxonomie.','Invalid taxonomy.'=>'Ongeldige taxonomie.','Select Link Category:'=>'Linkcategorie selecteren:','Stylesheet'=>'Stylesheet','Template'=>'Template','Number of links to show:'=>'Aantal te tonen links:','Link ID'=>'Link-ID','Link rating'=>'Link waardering','Link title'=>'Link titel','The "%s" theme is not a valid parent theme.'=>'Het thema "%s" is geen geldig hoofdthema.','Stylesheet is not readable.'=>'Stylesheet is niet leesbaar.','Customize: %s'=>'Aanpassen: %s','— Select —'=>'— Selecteren —','Tagline'=>'Slogan','Posts Page'=>'Berichtenpagina','Your latest posts'=>'Je laatste berichten','Navigation'=>'Navigatie','The post type may not be changed.'=>'Het berichttype kan niet worden gewijzigd.','Image default align'=>'Standaard uitlijning afbeelding','Image default size'=>'Standaard afbeeldingsformaat','Image default link type'=>'Standaard linktype voor afbeelding','Sorry, you are not allowed to edit this post.'=>'Je hebt geen toestemming om dit bericht te bewerken.','tag delimiter,'=>',','Sorry, you are not allowed to edit posts in this post type.'=>'Je hebt geen toestemming om berichten van dit berichttype te bewerken.','The post cannot be deleted.'=>'Het bericht kan niet worden verwijderd.','Sorry, you are not allowed to delete this category.'=>'Je hebt geen toestemming om deze categorie te verwijderen.','Sorry, you are not allowed to add a term to one of the given taxonomies.'=>'Je hebt geen toestemming om een term toe te voegen aan één van de opgegeven taxonomieën.','Ambiguous term name used in a hierarchical taxonomy. Please use term ID instead.'=>'Onduidelijke term-naam gebruikt in een hiërarchische taxonomie. Graag een term-ID gebruiken.','Sorry, you are not allowed to assign a term to one of the given taxonomies.'=>'Je hebt geen toestemming om een term toe te wijzen aan één van de opgegeven taxonomieën.','Sorry, one of the given taxonomies is not supported by the post type.'=>'Één van de geselecteerde taxonomieën wordt niet ondersteund voor dit berichttype.','Sorry, you are not allowed to view this item.'=>'Je hebt geen toestemming om dit item te bekijken.','Invalid author ID.'=>'Ongeldig auteur ID.','Sorry, you are not allowed to create posts as this user.'=>'Je hebt geen toestemming om berichten aan te maken als deze gebruiker.','Sorry, you are not allowed to create password protected posts in this post type.'=>'Je hebt geen toestemming om met wachtwoord beschermde berichten te maken voor dit berichttype.','Sorry, you are not allowed to create private posts in this post type.'=>'Je hebt geen toestemming om privéberichten te maken met dit berichttype.','yearly archives date formatY'=>'Y','monthly archives date formatF Y'=>'F Y','double prime″'=>'″','prime′'=>'′','apostrophe’'=>'’','Allow search engines to index this site.'=>'Zoekmachines toestaan deze site te indexeren.','Create a Configuration File'=>'Configuratiebestand aanmaken','You can create a %s file through a web interface, but this doesn\'t work for all server setups. The safest way is to manually create the file.'=>'Je kunt een %s-bestand aanmaken via de web-interface, maar dit werkt niet voor alle servertypes. De veiligste manier is om het bestand handmatig aan te maken.','%1$s is your new site. Log in as “%3$s” using your existing password.'=>'%1$s is je nieuwe site. Log in als “%3$s” met je bestaande wachtwoord.','Your site at %1$s is active. You may now log in to your site using your chosen username of “%2$s”. Please check your email inbox at %3$s for your password and login instructions. If you do not receive an email, please check your junk or spam folder. If you still do not receive an email within an hour, you can reset your password.'=>'Je site op %1$s is actief. Je kunt nu inloggen op je site met de door je gekozen gebruikersnaam “%2$s”. Controleer je e-mail inbox op %3$s voor je wachtwoord en login instructies. Als je geen e-mail ontvangt, controleer dan je map met ongewenste e-mail of spam. Als je binnen een uur nog steeds geen e-mail hebt ontvangen, kun je je wachtwoord opnieuw instellen.','Your account has been activated. You may now log in to the site using your chosen username of “%2$s”. Please check your email inbox at %3$s for your password and login instructions. If you do not receive an email, please check your junk or spam folder. If you still do not receive an email within an hour, you can reset your password.'=>'Je account is geactiveerd. Je kunt nu inloggen op de site met je gekozen gebruikersnaam “%2$s”. Controleer je e-mail van %3$s voor je wachtwoord en verdere login instructies. Mocht je geen e-mail ontvangen hebben controleer dan je spam of junk map. Heb je na een uur nog niets ontvangen dan kun je je wachtwoord herstellen.','One or more database tables are unavailable. The database may need to be repaired.'=>'Eén of meer databasetabellen zijn niet beschikbaar. De database moet waarschijnlijk worden gerepareerd.','You are posting comments too quickly. Slow down.'=>'Je plaatst te snel reacties. Rustig aan.','admin bar menu group labelNew'=>'Nieuw','%s exceeds the maximum upload size for the multi-file uploader when used in your browser.'=>'%s overschrijdt de maximale uploadgrootte voor de multi-bestandsuploader zoals gebruikt in je browser.','“%s” has failed to upload.'=>'Uploaden van “%s” is mislukt.','Please try uploading this file with the %1$sbrowser uploader%2$s.'=>'Probeer dit bestand te uploaden met de %1$sbrowser uploader%2$s.','links widgetAll Links'=>'Alle links','em dash—'=>'—','en dash–'=>'–','The menu ID should not be empty.'=>'Het menu-ID mag niet leeg zijn.','About WordPress'=>'Over WordPress','%s exceeds the maximum upload size for this site.'=>'%s overschrijdt de maximale uploadgrootte voor deze site.','Feedback'=>'Feedback','Error: Please type your comment text.'=>'Fout: type je reactie tekst.','Error: Please enter a valid email address.'=>'Fout: voer een geldig e-mailadres in.','Documentation'=>'Documentatie','…'=>'…','Error establishing a database connection'=>'Fout bij het maken van de databaseconnectie','Database Error'=>'Databasefout','%s Comment'=>'%s reactie' . "\0" . '%s reacties','WordPress.org'=>'WordPress.org','Network Admin: %s'=>'Netwerkbeheer: %s','taxonomy singular nameTag'=>'Tag','taxonomy general nameTags'=>'Tags','Scripts and styles should not be registered or enqueued until the %1$s, %2$s, or %3$s hooks.'=>'Scripts en stijlen zouden niet geregistreerd of geladen mogen worden vóór de hooks %1$s, %2$s, of %3$s.','You have been added to this site. Please visit the homepage or log in using your username and password.'=>'Je bent toegevoegd aan deze site. Bezoek de homepage of log in met je gebruikersnaam en wachtwoord.','Memory exceeded. Please try another smaller file.'=>'Het geheugen is overschreden. Probeer opnieuw met een kleiner bestand.','This is larger than the maximum size. Please try another.'=>'Dit is groter dan de maximaal toegestane grootte. Een ander bestand proberen.','This file is not an image. Please try another.'=>'Dit bestand is geen afbeelding. Probeer een ander bestand.','admin color schemeBlue'=>'Blauw','The timezone you have entered is not valid. Please select a valid timezone.'=>'De tijdzone die je hebt ingevoerd is niet geldig. Selecteer een geldige tijdzone.','add new from admin barSite'=>'Site','add new from admin barUser'=>'Gebruiker','add new from admin barMedia'=>'Media','View Category'=>'Categorie bekijken','View Tag'=>'Tag bekijken','You should specify an action to be verified by using the first parameter.'=>'Je moet een actie specificeren die kan worden geverifieerd door gebruik te maken van de eerste parameter.','Your account is now activated. Log in or go back to the homepage.'=>'Je account is nu geactiveerd. Log in of ga terug naar de homepage.','Your account is now activated. View your site or Log in'=>'Je account is nu geactiveerd. Bekijk je site of Log in','Link'=>'Link','All Pages'=>'Alle pagina\'s','All Posts'=>'Alle berichten','Pingback:'=>'Pingback:','Post navigation'=>'Bericht navigatie','Comments navigation'=>'Reacties navigatie','Poster'=>'Schrijver','Preload'=>'Vooraf laden','Toolbar'=>'Toolbar','Destination directory for file streaming does not exist or is not writable.'=>'De doelfolder voor het streamen van bestanden bestaat niet of er kan niet naar worden geschreven.','There are no HTTP transports available which can complete the requested request.'=>'Er zijn geen HTTP aanvragen beschikbaar die aan de gevraagde aanvraag kunnen voldoen.','post formatFormat'=>'Format','Or link to existing content'=>'Of link naar bestaande inhoud','Enter the destination URL'=>'Geef de URL van de bestemming','Conditional query tags do not work before the query is run. Before then, they always return false.'=>'Voorwaardelijke query tags werken niet voordat de query is uitgevoerd. Daarvoor geeft deze altijd false terug.','The user is already active.'=>'De gebruiker is al actief.','Function %1$s was called incorrectly. %2$s %3$s'=>'Functie %1$s werd verkeerd aangeroepen. %2$s %3$s','(This message was added in version %s.)'=>'(Dit bericht is toegevoegd in versie %s.)','Permalink: %s'=>'Permalink: %s','Post formatStandard'=>'Standaard','Your address will be %s.'=>'Je adres wordt %s.','domain'=>'domein','Post formatAudio'=>'Audio','Invalid post format.'=>'Ongeldig bericht format.','No search term specified. Showing recent items.'=>'Geen zoekopdracht term opgegeven. Recente items worden getoond.','Only a static class method or function can be used in an uninstall hook.'=>'Alleen een statische klassemethode of -functie kan gebruikt worden in een de-installatie hook.','Add New'=>'Nieuwe toevoegen','Passing an integer number of posts is deprecated. Pass an array of arguments instead.'=>'Het doorgeven van een geheel getal van berichten is verouderd. Geef in plaats daarvan een array van argumenten door.','Post formatVideo'=>'Video','Post formatStatus'=>'Status','Post formatQuote'=>'Citaat','Post formatImage'=>'Afbeelding','Post formatLink'=>'Link','Post formatGallery'=>'Galerij','Post formatChat'=>'Chat','Post formatAside'=>'Aside','No pages found in Trash.'=>'Geen pagina\'s gevonden in de prullenbak.','No posts found in Trash.'=>'Geen berichten gevonden in de prullenbak.','No pages found.'=>'Geen pagina\'s gevonden.','Shortlink'=>'Verkorte link','Invalid attachment ID.'=>'Ongeldig bijlage-ID.','This file no longer needs to be included.'=>'Dit bestand hoeft niet langer te worden toegevoegd.','Display as dropdown'=>'Toon als dropdown','Large size image height'=>'Hoogte grote afbeelding','Large size image width'=>'Breedte grote afbeeldingen','Medium size image height'=>'Hoogte gemiddelde afbeelding','Medium size image width'=>'Breedte gemiddelde afbeelding','Crop thumbnail to exact dimensions'=>'Thumbnail bijsnijden naar exacte afmetingen','Thumbnail Height'=>'Thumbnail hoogte','Thumbnail Width'=>'Thumbnail breedte','Confirm new password'=>'Nieuw wachtwoord bevestigen','New password'=>'Nieuw wachtwoord','Reset Password'=>'Wachtwoord opnieuw instellen','Your password has been reset.'=>'Je wachtwoord is opnieuw ingesteld.','Password Reset'=>'Wachtwoord opnieuw instellen','To reset your password, visit the following address:'=>'Ga naar dit adres om je wachtwoord opnieuw in te stellen:','If this was a mistake, ignore this email and nothing will happen.'=>'Als dit een vergissing was, kun je deze e-mail negeren en zal er niets gebeuren.','Someone has requested a password reset for the following account:'=>'Iemand heeft verzocht om het wachtwoord van het volgende account opnieuw in te stellen:','Invalid post.'=>'Ongeldig bericht.','Manage Site'=>'Beheer site','Manage Comments'=>'Reacties beheren','Blavatar'=>'Blavatar','Invalid taxonomy: %s.'=>'Ongeldige taxonomie: %s.','New Link Category Name'=>'Nieuwe link categorienaam','Add New Link Category'=>'Een nieuwe linkcategorie toevoegen','Update Link Category'=>'Link categorie updaten','All Link Categories'=>'Alle linkcategorieën','Search Link Categories'=>'Linkcategorieën zoeken','Link Category'=>'Linkcategorie','User'=>'Gebruiker','Network Admin'=>'Netwerkbeheer','You have searched the %1$s blog archives for ‘%2$s’. If you are unable to find anything in these search results, you can try one of these links.'=>'Je hebt in de %1$s blogarchieven gezocht naar ‘%2$s’. Als je niets kunt vinden in deze zoekresultaten, kun je een van deze links proberen.','F, Y'=>'F, Y','l, F jS, Y'=>'l, F jS, Y','You are currently browsing the archives for the %s category.'=>'Je bladert momenteel door de archieven van de categorie %s.','%1$s and %2$s'=>'%1$s en %2$s','%1$s is proudly powered by %2$s'=>'%1$s wordt met trots aangedreven door %2$s','“%s”'=>'“%s”','%s response'=>'%s reactie' . "\0" . '%s reacties','One response'=>'Één reactie','This post is password protected. Enter the password to view comments.'=>'Dit bericht is beschermd met een wachtwoord. Voer het wachtwoord in om de reacties te bekijken.','Choose from the most used tags'=>'Kies uit de meest gebruikte tags','New Category Name'=>'Nieuwe categorienaam','New Tag Name'=>'Nieuwe tagnaam','Add New Category'=>'Nieuwe categorie toevoegen','Add New Tag'=>'Nieuwe tag toevoegen','Update Tag'=>'Tag updaten','Parent Category:'=>'Hoofdcategorie:','Parent Category'=>'Hoofdcategorie','All Tags'=>'Alle tags','Popular Tags'=>'Populaire tags','Search Tags'=>'Tags zoeken','taxonomy singular nameCategory'=>'Categorie','taxonomy general nameCategories'=>'Categorieën','Sorry, new registrations are not allowed at this time.'=>'Op dit moment zijn nieuwe registraties niet toegestaan.','Check the junk or spam folder of your email client. Sometime emails wind up there by mistake.'=>'Controleer de prullenbak of spam map van je e-mailprogramma. Soms komen e-mails per ongeluk daar terecht.','Wait a little longer. Sometimes delivery of email can be delayed by processes outside of our control.'=>'Wacht nog even. Soms kan de aflevering van e-mail worden vertraagd door processen buiten onze controle.','Your registration email is sent to this address. (Double-check your email address before continuing.)'=>'Je registratie e-mail wordt naar dit adres verzonden. (Controleer je e-mailadres voordat je verder gaat.)','Parent Page:'=>'Hoofdpagina:','No patterns found in Trash.'=>'Geen patronen gevonden in de prullenbak.','Search Pages'=>'Pagina\'s zoeken','Search Posts'=>'Berichten zoeken','Edit Page'=>'Pagina bewerken','Add New Page'=>'Nieuwe pagina toevoegen','Add New Post'=>'Nieuw bericht toevoegen','post type singular namePage'=>'Pagina','post type singular namePost'=>'Bericht','post type general namePages'=>'Pagina\'s','post type general namePosts'=>'Berichten','Error: This username is invalid because it uses illegal characters. Please enter a valid username.'=>'Fout: deze gebruikersnaam is ongeldig omdat er illegale tekens in voorkomen. Voer een geldige gebruikersnaam in.','Required fields are marked %s'=>'Vereiste velden zijn gemarkeerd met %s','Please include a %s template in your theme.'=>'Graag een %s template aan je thema toevoegen.','Theme without %s'=>'Thema zonder %s','Sorry, you must be able to edit posts on this site in order to view categories.'=>'Je moet berichten kunnen bewerken op deze site om categorieën te kunnen bekijken.','Sorry, you are not allowed to publish pages on this site.'=>'Je hebt geen toestemming om pagina\'s te publiceren op deze site.','Sorry, you are not allowed to publish posts on this site.'=>'Je hebt geen toestemming om berichten op deze site te publiceren.','Sorry, you are not allowed to post on this site.'=>'Je hebt geen toestemming om berichten op deze site te plaatsen.','Sorry, you are not allowed to access details about this site.'=>'Je hebt geen toestemming om de details van deze site te bekijken.','Sorry, you must be able to edit posts on this site in order to view tags.'=>'Je moet berichten op deze site kunnen bewerken om tags te kunnen bekijken.','Site Tagline'=>'Site slogan','Site URL.'=>'Site URL.','New user registration on your site %s:'=>'Nieuwe gebruiker geregistreerd op je site %s:','New %1$s Site: %2$s'=>'Nieuw %1$s site: %2$s','New Site Registration: %s'=>'Nieuwe site registratie: %s','The site is already active.'=>'Deze site is al actief.','To activate your site, please click the following link:
%1$s
After you activate, you will receive *another email* with your login.
After you activate, you can visit your site here:
%2$s'=>'Om je site te activeren, klik op de volgende link:
%1$s
Nadat je hebt geactiveerd, ontvang je *een andere e-mail* met je login.
Nadat je hebt geactiveerd, kun je je site hier bezoeken:
%2$s','That site is currently reserved but may be available in a couple days.'=>'Deze site is momenteel gereserveerd, maar komt wellicht binnenkort beschikbaar.','Sorry, that site is reserved!'=>'Deze site is gereserveerd!','Sorry, that site already exists!'=>'Deze site bestaat al!','Sorry, site names must have letters too!'=>'Sitenamen moeten ook letters bevatten!','Sorry, you may not use that site name.'=>'Je mag deze site naam niet gebruiken.','This site has been archived or suspended.'=>'Deze site is gearchiveerd of buiten werking gesteld.','The site you have requested is not installed properly. Please contact the system administrator.'=>'De site die je hebt aangevraagd is niet correct geïnstalleerd. Neem contact op met de systeembeheerder.','The given object ID is not that of a menu item.'=>'Het opgegeven object-ID is niet van een menu-item.','The Site address you entered did not appear to be a valid URL. Please enter a valid URL.'=>'Het site adres dat je hebt ingevoerd bleek geen geldige URL te zijn. Voer een geldige URL in.','The WordPress address you entered did not appear to be a valid URL. Please enter a valid URL.'=>'Het WordPress adres dat je hebt ingevoerd blijkt geen geldige URL te zijn. Voer een geldige URL in.','The email address entered did not appear to be a valid email address. Please enter a valid email address.'=>'Het ingevoerde e-mailadres blijkt geen geldig e-mailadres te zijn. Voer een geldig e-mailadres in.','A term with the name provided already exists with this parent.'=>'Een term met de opgegeven naam bestaat al met deze hoofdnaam.','An error occurred adding you to this site. Go to the homepage.'=>'Er is een fout opgetreden bij het toevoegen van je account op deze site. Ga naar de homepage.','Your email address will not be published.'=>'Je e-mailadres wordt niet gepubliceerd.','A valid URL was not provided.'=>'De opgegeven URL is ongeldig.','Could not calculate resized image dimensions'=>'De afmetingen van de geschaalde afbeelding konden niet worden berekend','Completed (%s)'=>'Afgerond (%s)' . "\0" . 'Afgerond (%s)','You are logged in already. No need to register again!'=>'Je bent al ingelogd. Je hoeft je dus niet opnieuw te registreren!','You must first log in, and then you can create a new site.'=>'Je moet eerst inloggen, daarna kun je een nieuwe site maken.','Welcome back, %s. By filling out the form below, you can add another site to your account. There is no limit to the number of sites you can have, so create to your heart’s content, but write responsibly!'=>'Welkom terug, %s. Door het onderstaande formulier in te vullen, kun je een andere site aan je account toevoegen. Er is geen limiet aan het aantal sites dat je kunt hebben, dus maak inhoud uit je hart, maar schrijf verantwoord!','Must be at least 4 characters, letters and numbers only. It cannot be changed, so choose carefully!'=>'Het moeten minstens 4 karakters zijn, alleen letters en cijfers. Het kan niet veranderd worden, dus wees voorzichtig!','This action has been disabled by the administrator.'=>'Deze handeling is uitgeschakeld door de beheerder.','Page %s'=>'Pagina %s','Briefly unavailable for scheduled maintenance. Check back in a minute.'=>'Tijdelijk niet beschikbaar vanwege gepland onderhoud. Probeer het over enkele minuten nog een keer.','Maintenance'=>'Onderhoud','Navigation Menus'=>'Navigatiemenu\'s','Navigation Menu Item'=>'Navigatie menu-item','Navigation Menu Items'=>'Navigatie menu-items','Links for %s'=>'Links voor %s','No menus have been created yet. Create some.'=>'Er zijn nog geen menu\'s aangemaakt. Maak er één aan.','This is the short link.'=>'Dit is een verkorte link.','%d Theme Update'=>'%d thema update' . "\0" . '%d thema updates','%d Plugin Update'=>'%d plugin update' . "\0" . '%d plugin updates','%d WordPress Update'=>'%d WordPress update','Site registration has been disabled.'=>'Site registratie is uitgeschakeld.','If you do not activate your site within two days, you will have to sign up again.'=>'Als je de site niet binnen twee dagen activeert, zul je opnieuw moeten beginnen.','But, before you can start using your site, you must activate it.'=>'Maar voordat je je site kunt gebruiken, moet je hem activeren.','Congratulations! Your new site, %s, is almost ready.'=>'Gefeliciteerd! Je nieuwe site %s is bijna klaar.','Gimme a site!'=>'Geef me een site!','The site %s is yours.'=>'De site %s is van jou.','Create Site'=>'Site aanmaken','If you are not going to use a great site domain, leave it for a new user. Now have at it!'=>'Als je een geweldig site domein niet gaat gebruiken, laat het dan over voor een nieuwe gebruiker. Nu aan de slag!','Sites you are already a member of:'=>'Sites waar je al lid van bent:','Get another %s site in seconds'=>'Verkrijg een andere %s site binnen enkele seconden','Site Title:'=>'Site titel:','sitename'=>'sitenaam','File canceled.'=>'Bestand geannuleerd.','A new comment on the post "%s" is waiting for your approval'=>'Een nieuwe reactie op het bericht "%s", wacht op je goedkeuring','A new pingback on the post "%s" is waiting for your approval'=>'Een nieuwe pingback op het bericht "%s", wacht op je goedkeuring','A new trackback on the post "%s" is waiting for your approval'=>'Een nieuwe trackback op bericht "%s" wacht op je goedkeuring','New pingback on your post "%s"'=>'Nieuwe pingback op je bericht "%s"','New trackback on your post "%s"'=>'Nieuwe trackback op je bericht "%s"','New comment on your post "%s"'=>'Nieuwe reactie op je bericht "%s"','If your site does not display, please contact the owner of this network.'=>'Indien je site niet vertoond wordt, neem dan contact op met de eigenaar van dit netwerk.','Select Menu:'=>'Menu selecteren:','Navigation Menu'=>'Navigatiemenu','Taxonomy:'=>'Taxonomie:','Search results for: "%s"'=>'Zoekresultaten voor: %s','One response to %s'=>'Eén reactie op %s','Menus'=>'Menu\'s','Your PHP installation appears to be missing the MySQL extension which is required by WordPress.'=>'Je PHP installatie lijkt de MySQL extensie te missen die vereist is door WordPress.','The specified target URL does not exist.'=>'De opgegeven doel URL bestaat niet.','Pingback from %1$s to %2$s registered. Keep the web talking! :-)'=>'Pingback van %1$s naar %2$s geregistreerd. Houd het web aan het praten! :-)','The source URL does not contain a link to the target URL, and so cannot be used as a source.'=>'De bron-URL bevat geen link naar de doel-URL en kan daarom niet als bron worden gebruikt.','The source URL does not exist.'=>'De bron-URL bestaat niet.','The pingback has already been registered.'=>'De pingback is al geregistreerd.','The source URL and the target URL cannot both point to the same resource.'=>'De gegevensbron-URL en de doel-URL kunnen niet naar hetzelfde adres verwijzen.','The specified target URL cannot be used as a target. It either does not exist, or it is not a pingback-enabled resource.'=>'De opgegeven doel URL kan niet worden gebruikt als doel. Het bestaat niet of het is geen gegevensbron die ingeschakeld is voor pingback.','Is there no link to us?'=>'Is er geen link naar ons?','Could not write file %1$s (%2$s).'=>'Kon niet schrijven naar bestand %1$s (%2$s).','Sorry, you are not allowed to change the page author as this user.'=>'Je hebt geen toestemming om de auteur van deze pagina te wijzigen.','Sorry, you are not allowed to change the post author as this user.'=>'Je hebt geen toestemming om de berichtauteur te bewerken als deze gebruiker.','Sorry, you are not allowed to update posts as this user.'=>'Je hebt geen toestemming om berichten te updaten als deze gebruiker.','Invalid post type.'=>'Ongeldig berichttype.','Sorry, you are not allowed to publish posts in this post type.'=>'Je hebt geen toestemming om berichten te publiceren van dit berichttype.','Sorry, no such post.'=>'Dit bericht bestaat niet.','Sorry, you are not allowed to publish this post.'=>'Je hebt geen toestemming om dit bericht te publiceren.','Either there are no posts, or something went wrong.'=>'Er zijn geen berichten of er is iets misgegaan.','Sorry, you are not allowed to update options.'=>'Je hebt geen toestemming om de opties te updaten.','Sorry, you are not allowed to access details of this post.'=>'Je hebt geen toestemming om de details van dit bericht te bekijken.','A valid email address is required.'=>'Een geldig e-mailadres is vereist.','Comment author name and email are required.'=>'Naam en e-mailadres zijn vereist bij het plaatsen van een reactie.','Invalid post ID.'=>'Ongeldig bericht ID.','Invalid comment status.'=>'Ongeldige reactie status.','Invalid comment ID.'=>'Ongeldige reactie ID.','Failed to delete the page.'=>'Pagina verwijderen mislukt.','Sorry, no such page.'=>'Deze pagina bestaat niet.','Allow new users to sign up'=>'Registratie nieuwe gebruikers toestaan','Time Zone'=>'Tijdzone','Software Version'=>'Softwareversie','Software Name'=>'Softwarenaam','User registration has been disabled.'=>'Gebruikersregistratie is uitgeschakeld.','Registration has been disabled.'=>'Registratie is uitgeschakeld.','If you have not received your email yet, there are a number of things you can do:'=>'Als je je e-mail nog niet hebt ontvangen, zijn er een aantal dingen die je kunt doen:','Still waiting for your email?'=>'Wacht je nog steeds op je e-mail?','Sign up'=>'Registreren','If you do not activate your username within two days, you will have to sign up again.'=>'Als je de gebruikersnaam niet binnen twee dagen activeert, moet je je opnieuw registreren.','But, before you can start using your new username, you must activate it.'=>'Voordat je kunt starten met je nieuwe gebruikersnaam, moet je deze eerst activeren.','%s is your new username'=>'%s is je nieuwe gebruikersnaam','Next'=>'Volgende','Just a username, please.'=>'Gewoon een gebruikersnaam.','Get your own %s account in seconds'=>'Verkrijg je eigen %s-account binnen enkele seconden','There was a problem, please correct the form below and try again.'=>'Er was een probleem, corrigeer onderstaand formulier en probeer opnieuw.','Email Address:'=>'E-mailadres:','(Must be at least 4 characters, lowercase letters and numbers only.)'=>'(Moet minimaal 4 tekens zijn, alleen kleine letters en cijfers.)','Privacy:'=>'Privacy:','Oops: %s'=>'Oeps: %s','There does not seem to be any new mail.'=>'Het lijkt erop dat er geen nieuwe e-mail is.','Slow down cowboy, no need to check for new mails so often!'=>'Rustig aan vriend, je hoeft je mail niet zo vaak te controleren!','You are now logged out.'=>'Je bent nu uitgelogd.','You have logged in successfully.'=>'Je bent succesvol ingelogd.','Lost your password?'=>'Je wachtwoord vergeten?','Register For This Site'=>'Registreren voor deze site','Registration Form'=>'Registratieformulier','Get New Password'=>'Nieuw wachtwoord aanmaken','Lost Password'=>'Wachtwoord kwijt','Error: The email address is not correct.'=>'Fout: het e-mailadres is niet correct.','Error: Please type your email address.'=>'Fout: vul je e-mailadres in.','Invalid key.'=>'Ongeldige sleutel.','[%s] Password Reset'=>'[%s] Wachtwoord resetten','Password reset is not allowed for this user'=>'Wachtwoordreset is niet toegestaan voor deze gebruiker','Error: Please enter a username or email address.'=>'Fout: geef een gebruikersnaam of e-mailadres op.','Powered by WordPress'=>'Mogelijk gemaakt door WordPress','Error: WordPress %1$s requires MySQL %2$s or higher'=>'Fout: WordPress %1$s vereist MySQL %2$s of nieuwer','Sidebar %d'=>'Zijbalk %d','Please log in again.'=>'Opnieuw inloggen','Error: Your account has been marked as a spammer.'=>'Fout: je account is gemarkeerd als spammer.','Error: The password field is empty.'=>'Fout: Het wachtwoordveld is leeg.','Error: The username field is empty.'=>'Fout: Het gebruikersnaamveld is leeg.','Stylesheet is missing.'=>'Stylesheet ontbreekt.','The parent theme is missing. Please install the "%s" parent theme.'=>'Er is geen hoofdthema aanwezig. Het hoofdthema "%s" installeren.','Invalid object ID.'=>'Ongeldig object-ID.','The slug “%s” is already in use by another term.'=>'De slug (permalink) “%s” is al in gebruik door een andere term.','Could not insert term into the database.'=>'Kon term niet in de database invoegen.','Invalid item ID.'=>'Ongeldig item ID.','Empty Term.'=>'Lege term.','password strengthMedium'=>'Gemiddeld','Separate pattern categories with commas'=>'Patrooncategorieën scheiden met komma\'s','moved to the Trash.'=>'verplaatst naar de prullenbak.','Crunching…'=>'Een ogenblik geduld…','Upload stopped.'=>'Uploaden gestopt.','Security error.'=>'Beveiligingsfout.','IO error.'=>'IO-fout.','Upload failed.'=>'Uploaden mislukt.','You may only upload 1 file.'=>'Je mag slechts 1 bestand uploaden.','There was a configuration error. Please contact the server administrator.'=>'Er was een configuratie fout. Neem contact op met de serverbeheerder.','An error occurred in the upload. Please try again later.'=>'Fout opgetreden bij het uploaden. Probeer later nog eens.','This file is empty. Please try another.'=>'Dit bestand is leeg. Probeer een ander.','You have attempted to queue too many files.'=>'Je probeerde te veel bestanden in de wachtrij te plaatsen.','This feature requires inline frames. You have iframes disabled or your browser does not support them.'=>'Deze functie vereist inline-frames. Je hebt inline-frames uitgeschakeld of de browser ondersteunt ze niet.','of'=>'van','Image'=>'Afbeelding','< Prev'=>'< Vorige','Next >'=>'Volgende >','Enter a description of the image'=>'Geef een beschrijving van de afbeelding','Enter the URL of the image'=>'URL van de afbeelding invoeren','Enter the URL'=>'URL invoeren','close tags'=>'tags sluiten','Close all open tags'=>'Alle open tags sluiten','An error has occurred, which probably means the feed is down. Try again later.'=>'Er is een fout opgetreden, wat waarschijnlijk betekent dat de feed uit de lucht is. Probeer later opnieuw.','Jabber / Google Talk'=>'Jabber / Google Talk','Yahoo IM'=>'Yahoo IM','AIM'=>'AIM','Cannot create a user with an empty login name.'=>'Kan geen gebruiker aanmaken met een lege login naam.','Cannot create a revision of a revision'=>'Kan geen revisie van een revisie aanmaken','Could not insert post into the database.'=>'Kon het bericht niet aan de database toevoegen.','Could not update post in the database.'=>'Kon het bericht in de database niet updaten.','Content, title, and excerpt are empty.'=>'Inhoud, titel en samenvatting zijn leeg.','Document (%s)'=>'Document (%s)' . "\0" . 'Documenten (%s)','Trash (%s)'=>'Prullenbak (%s)' . "\0" . 'Prullenbak (%s)','Private (%s)'=>'Privé (%s)' . "\0" . 'Privé (%s)','Pending (%s)'=>'Wachtend (%s)' . "\0" . 'Wachtend (%s)','Draft (%s)'=>'Concept (%s)' . "\0" . 'Concepten (%s)','Scheduled (%s)'=>'Ingepland (%s)' . "\0" . 'Ingepland (%s)','Published (%s)'=>'Gepubliceerd (%s)' . "\0" . 'Gepubliceerd (%s)','Revision'=>'Revisie','%s [Current Revision]'=>'%s [Huidige revisie]','%s [Autosave]'=>'%s [Automatisch opslaan]','Home'=>'Home','Previous page'=>'Vorige pagina','Next page'=>'Volgende pagina','There is no excerpt because this is a protected post.'=>'Er is geen samenvatting, omdat dit een beschermd bericht is.','Private: %s'=>'Privé: %s','Protected: %s'=>'Beschermd: %s','[%s] New User Registration'=>'[%s] Registratie nieuwe gebruiker','Username: %s'=>'Gebruikersnaam: %s','[%1$s] Please moderate: "%2$s"'=>'[%1$s] Graag "%2$s" modereren','Currently %s comment is waiting for approval. Please visit the moderation panel:'=>'Er wacht %s reactie op goedkeuring. Ga naar het moderatiescherm:' . "\0" . 'Er wachten %s reacties op goedkeuring. Ga naar het moderatiescherm:','Approve it: %s'=>'Keur het goed: %s','Pingback excerpt: '=>'Pingback samenvatting: ','Trackback excerpt: '=>'Trackback samenvatting: ','Spam it: %s'=>'%s als spam markeren','Delete it: %s'=>'%s verwijderen','Trash it: %s'=>'Naar de prullenbak: %s','[%1$s] Pingback: "%2$s"'=>'[%1$s] Pingback: "%2$s"','[%1$s] Trackback: "%2$s"'=>'[%1$s] Trackback: "%2$s"','[%1$s] Comment: "%2$s"'=>'[%1$s] Reactie: "%2$s"','If you are still stuck with this message, then check that your database contains the following tables:'=>'Als je nog steeds met dit bericht blijft zitten, controleer dan of je database de volgende tabellen bevat:','What do I do now?'=>'Wat moet ik nu doen?','This file is too big. Files must be less than %s KB in size.'=>'Dit bestand is te groot. Bestanden moeten kleiner zijn dan %s KB in grootte.','Sorry, you have used your space allocation of %s. Please delete some files to upload more files.'=>'Je hebt al je ruimte verbruikt van %s. Verwijder enkele bestanden om meer bestanden te kunnen uploaden.','New %1$s User: %2$s'=>'Nieuwe %1$s gebruiker: %2$s','New User Registration: %s'=>'Nieuwe gebruikersregistratie: %s','That username is already activated.'=>'Deze gebruikersnaam is al geactiveerd.','Could not create user'=>'Gebruiker kon niet worden aangemaakt','Invalid activation key.'=>'Ongeldige activeringssleutel.','That email address has already been used. Please check your inbox for an activation email. It will become available in a couple of days if you do nothing.'=>'Dat e-mailadres is al gebruikt. Controleer je inbox voor een activerings e-mail. Het zal over een paar dagen beschikbaar zijn als je niets doet.','That username is currently reserved but may be available in a couple of days.'=>'Deze gebruikersnaam is momenteel gereserveerd, maar kan binnen een paar dagen beschikbaar komen.','Sorry, that email address is already used!'=>'Dit e-mailadres is al in gebruik!','Sorry, that username already exists!'=>'Deze gebruikersnaam bestaat al!','Sorry, that email address is not allowed!'=>'Dit e-mailadres is niet toegestaan!','Sorry, usernames must have letters too!'=>'Gebruikersnamen moeten letters bevatten!','You cannot use that email address to signup. There are problems with them blocking some emails from WordPress. Please use another email provider.'=>'Je kunt dat e-mailadres niet gebruiken om je aan te melden. Er zijn problemen met het blokkeren van sommige e-mails van WordPress. Gebruik een andere e-mail provider.','That user does not exist.'=>'Die gebruiker bestaat niet.','PM'=>'PM','AM'=>'AM','pm'=>'pm','am'=>'am','« Older Comments'=>'« Oudere reacties','Newer Comments »'=>'Nieuwere reacties »','Last Post'=>'Laatste bericht','Next Post'=>'Volgend bericht','Previous Post'=>'Vorig bericht','Comments Feed'=>'Reacties feed','Insert Page Break tag'=>'Tag pagina-einde invoegen','Fill Screen'=>'Schermvullend','Remove link'=>'Link verwijderen','Insert link'=>'Link invoegen','Check Spelling'=>'Spelling controleren','Select all'=>'Alles selecteren','Action'=>'Actie','Letter'=>'Letter','Link Rel'=>'Linkrelatie','Source'=>'Bron','Bottom Right'=>'Rechtsonder','Bottom Left'=>'Linksonder','Top Right'=>'Rechtsboven','Top Left'=>'Linksboven','Mute'=>'Dempen','Fullscreen'=>'Volledig scherm','Align'=>'Uitlijnen','Loop'=>'Lus','Type'=>'Type','Constrain proportions'=>'Afmetingen beperken','General'=>'Algemeen','The URL you entered seems to be an external link. Do you want to add the required http:// prefix?'=>'De URL die je hebt ingevoerd lijkt op een externe link. Wil je het vereiste https://-voorvoegsel toevoegen?','The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?'=>'De URL die je hebt ingevoerd lijkt op een e-mailadres. Wil je het vereiste mailto: voorvoegsel toevoegen?','Bottom'=>'Onderkant','Middle'=>'Midden','Top'=>'Bovenkant','Horizontal space'=>'Horizontale ruimte','Vertical space'=>'Verticale ruimte','Dimensions'=>'Afmetingen','Border'=>'Rand','Image description'=>'Afbeeldingsbeschrijving','New document'=>'Nieuw document','Paste'=>'Plakken','Copy'=>'Kopiëren','Cut'=>'Knippen','Superscript'=>'Superscript','Subscript'=>'Subscript','Strikethrough'=>'Doorgehaald','Underline'=>'Onderstreept','Italic'=>'Cursief','Bold'=>'Vet','Code'=>'Code','Blockquote'=>'Blockquote','Heading 6'=>'Koptekst 6','Heading 5'=>'Koptekst 5','Heading 4'=>'Koptekst 4','Heading 3'=>'Koptekst 3','Heading 2'=>'Koptekst 2','Heading 1'=>'Koptekst 1','Paragraph'=>'Paragraaf','Language'=>'Taal','Document properties'=>'Documenteigenschappen','The changes you made will be lost if you navigate away from this page.'=>'De wijzigingen zullen verloren gaan als je deze pagina nu verlaat.','Column'=>'Kolom','Row'=>'Rij','Delete table'=>'Tabel verwijderen','Copy table row'=>'Tabelrij kopiëren','Cut table row'=>'Tabelrij knippen','Paste table row after'=>'Tabelrij onder plakken','Paste table row before'=>'Tabelrij boven plakken','Table properties'=>'Tabeleigenschappen','Table cell properties'=>'Tabelcel eigenschappen','Table row properties'=>'Tabelrij eigenschappen','Merge table cells'=>'Tabelcellen samenvoegen','Insert column after'=>'Kolom rechts invoegen','Insert column before'=>'Kolom links invoegen','Delete row'=>'Rij verwijderen','Insert row after'=>'Rij onder invoegen','Insert row before'=>'Rij boven invoegen','Insert/edit link'=>'Link invoegen/bewerken','Insert/edit image'=>'Afbeelding invoegen/bewerken','Print'=>'Afdrukken','Sat'=>'za','Fri'=>'vr','Thu'=>'do','Wed'=>'wo','Tue'=>'di','Mon'=>'ma','Sun'=>'zo','Too many redirects.'=>'Te veel omleidingen.','User has blocked requests through HTTP.'=>'Gebruiker heeft aanvragen via HTTP geblokkeerd.','Gray'=>'Grijs','Next »'=>'Volgende »','« Previous'=>'« Vorige','%1$s %2$s Search Results for “%3$s” Feed'=>'%1$s %2$s zoekresultaten voor “%3$s” feed','%1$s %2$s Posts by %3$s Feed'=>'%1$s %2$s berichten door %3$s feed','%1$s %2$s %3$s Tag Feed'=>'%1$s %2$s %3$s tagfeed','%1$s %2$s %3$s Category Feed'=>'%1$s %2$s %3$s categorie feed','%1$s %2$s %3$s Comments Feed'=>'%1$s %2$s %3$s reactiesfeed','%1$s %2$s Comments Feed'=>'%1$s %2$s reactiesfeed','%1$s %2$s Feed'=>'%1$s %2$s feed','feed link»'=>'»','calendar caption%1$s %2$s'=>'%1$s %2$s','%1$s %2$d'=>'%1$s %2$d','Page not found'=>'Pagina niet gevonden','Search Results %1$s %2$s'=>'Zoekresultaten %1$s %2$s','Site Admin'=>'Sitebeheerder','Register'=>'Registreren','Remember Me'=>'Onthoud mij','Log out'=>'Uitloggen','Log in'=>'Login','Manual Offsets'=>'Handmatige compensatie','UTC'=>'UTC','Select a city'=>'Een plaats selecteren','Function %1$s was called with an argument that is deprecated since version %2$s with no alternative available.'=>'Functie %1$s werd aangeroepen met een argument dat sinds versie %2$s is verouderd en waarvoor geen alternatief beschikbaar is.','Function %1$s was called with an argument that is deprecated since version %2$s! %3$s'=>'Functie %1$s werd aangeroepen met een argument dat sinds versie %2$s verouderd is! %3$s','Hook %1$s is deprecated since version %2$s with no alternative available.'=>'Hook %1$s is sinds versie %2$s verouderd en er is geen alternatief beschikbaar.','Hook %1$s is deprecated since version %2$s! Use %3$s instead.'=>'Hook %1$s is sinds versie %2$s verouderd! Gebruik in plaats daarvan %3$s.','WordPress › Error'=>'WordPress › fout','« Back'=>'« Terug','Please try again.'=>'Probeer het opnieuw.','Do you really want to log out?'=>'Weet je zeker dat je wil uitloggen?','You are attempting to log out of %s'=>'Je probeert uit te loggen van %s','Could not write file %s'=>'Kon het bestand %s niet schrijven','Empty filename'=>'Lege bestandsnaam','Unable to create directory %s. Is its parent directory writable by the server?'=>'Kan folder %s niet maken. Is de hoofdfolder beschrijfbaar door de server?','%s is a protected WP option and may not be modified'=>'%s is een beschermde WP-optie en kan niet worden gewijzigd',', '=>', ','%s day'=>'%s dag' . "\0" . '%s dagen','%s hour'=>'%s uur' . "\0" . '%s uur','Protected Comments: Please enter your password to view comments.'=>'Beschermde reacties: voer je wachtwoord in om de reacties te kunnen bekijken.','Comments on: %s'=>'Reacties op: %s','By: %s'=>'Door: %s','Comment on %1$s by %2$s'=>'Reactie op %1$s door %2$s','Comments for %s'=>'Reacties voor %s','Comments for %1$s searching on %2$s'=>'Reacties voor %1$s aan het zoeken op %2$s','Missing Attachment'=>'Ontbrekende bijlage','Last updated'=>'Laatst geüpdatet','new WordPress Loop'=>'nieuwe WordPress loop','Tag Cloud'=>'Tag cloud','Display item date?'=>'Toon item datum?','Display item author if available?'=>'Toon item auteur als deze beschikbaar is?','Display item content?'=>'Item-inhoud tonen?','How many items would you like to display?'=>'Hoeveel items wil je tonen?','Give the feed a title (optional):'=>'Geef de RSS-feed een titel (optioneel):','Enter the RSS feed URL here:'=>'Voer de URL van de RSS-feed hier in:','Untitled'=>'Naamloos','widgets%1$s on %2$s'=>'%1$s op %2$s','Number of posts to show:'=>'Aantal te tonen berichten:','Recent Posts'=>'Recente berichten','Show hierarchy'=>'Hiërarchie weergeven','Select Category'=>'Categorie selecteren','Automatically add paragraphs'=>'Automatisch paragrafen toevoegen','Text'=>'Tekst','Calendar'=>'Kalender','Show post counts'=>'Berichtaantal tonen','Select Month'=>'Maand selecteren','Show Link Rating'=>'Toon link waardering','Show Link Description'=>'Toon link beschrijving','Show Link Name'=>'Linknaam tonen','Show Link Image'=>'Afbeeldingslink tonen','Your blogroll'=>'Je blogroll','Page IDs, separated by commas.'=>'Pagina ID\'s, gescheiden door komma\'s.','Exclude:'=>'Uitsluiten:','Page ID'=>'Pagina ID','Page order'=>'Paginavolgorde','Page title'=>'Paginatitel','Sort by:'=>'Sorteren op:','Once Daily'=>'Eenmaal per dag','Twice Daily'=>'Tweemaal per dag','Once Hourly'=>'Eenmaal per uur','This argument has changed to an array to match the behavior of the other cron functions.'=>'Dit argument is veranderd in een array om overeen te komen met het gedrag van de andere cron functies.','Could not update comment status.'=>'Kon de reactie status niet updaten.','Duplicate comment detected; it looks as though you’ve already said that!'=>'Dubbele reactie ontdekt: het lijkt erop dat je dit al hebt gezegd!','Unapproved'=>'Geweigerd','Post Comment'=>'Reactie plaatsen','Cancel reply'=>'Reactie annuleren','Leave a Reply to %s'=>'Laat een antwoord achter aan %s','Leave a Reply'=>'Geef een reactie','Click here to cancel reply.'=>'Klik hier om je antwoord te annuleren.','Log in to leave a Comment'=>'Login om een reactie achter te laten','Leave a Comment'=>'Geef een reactie','Log in to Reply'=>'Log in om te reageren','Feed for all posts filed under %s'=>'Feed voor alle berichten opgeslagen onder %s','No categories'=>'Geen categorieën','Bookmarks'=>'Bladwijzers','Last updated: %s'=>'Laatst geüpdatet op: %s','Posts by %s'=>'Berichten van %s','Visit %s’s website'=>'Bezoek de site van %s','Meta'=>'Meta','Skip to content'=>'Ga naar de inhoud','(Edit)'=>'(Bewerken)','%1$s at %2$s'=>'%1$s om %2$s','Your comment is awaiting moderation.'=>'Je reactie is in afwachting van moderatie.','Comments are closed.'=>'Reacties zijn gesloten.','Pages:'=>'Pagina\'s:','Tags: '=>'Tags: ','You must be logged in to post a comment.'=>'Je moet ingelogd zijn op om een reactie te plaatsen.','Edit This'=>'Bewerk dit','1 Comment'=>'1 reactie','No Comments'=>'Geen reacties','Enter your password to view comments.'=>'Voer je wachtwoord in om reacties te bekijken.','Comments on %s'=>'Reacties op %s','No results found.'=>'Geen resultaten gevonden.','Next Page »'=>'Volgende pagina »','« Previous Page'=>'« Vorige pagina','Sorry, comments are closed for this item.'=>'Reacties op dit item zijn gesloten.','Widgets'=>'Widgets','Confirmed (%s)'=>'Bevestigd (%s)' . "\0" . 'Bevestigd (%s)','Website'=>'Site','Separate tags with commas'=>'Tags scheiden door komma\'s','Title:'=>'Titel:','HTML'=>'HTML','Default'=>'Standaard','Height'=>'Hoogte','Time Format'=>'Tijdnotatie','Date Format'=>'Datumnotatie','Email'=>'E-mail','Site Title'=>'Site titel','Theme'=>'Thema','Enable'=>'Inschakelen','First Post'=>'Eerste bericht','Settings'=>'Instellingen','My Sites'=>'Mijn sites','Themes'=>'Thema\'s','Sites'=>'Sites','Yes'=>'Ja','Edit Category'=>'Categorie bewerken','Log In'=>'Login','Strength indicator'=>'Sterkte-indicator','Dashboard'=>'Dashboard','There are no options for this widget.'=>'Er zijn geen opties voor deze widget.','Error: Please enter a username.'=>'Fout: vul een gebruikersnaam in.','Width'=>'Breedte','Yellow'=>'Geel','White'=>'Wit','Silver'=>'Zilver','Red'=>'Rood','Purple'=>'Paars','Pink'=>'Roze','Orange'=>'Oranje','Green'=>'Groen','Brown'=>'Bruin','Blue'=>'Blauw','Black'=>'Zwart','Help'=>'Hulp','(no title)'=>'(geen titel)','New Post'=>'Nieuw bericht','Edit Media'=>'Media bewerken','New Page'=>'Nieuwe pagina','Select'=>'Selecteren','Close'=>'Sluiten','Pages'=>'Pagina\'s','Email: %s'=>'E-mail: %s','Links'=>'Links','View Page'=>'Pagina bekijken','Images'=>'Afbeeldingen','By %s'=>'Door %s','Version'=>'Versie','Search'=>'Zoeken','Dismiss'=>'Negeren','All Categories'=>'Alle categorieën','Add'=>'Toevoegen','Add or remove tags'=>'Tags toevoegen of verwijderen','Update'=>'Updaten','Public'=>'Openbaar','Private'=>'Privé','OK'=>'OK','Image URL'=>'Afbeelding URL','Actions'=>'Acties','Media'=>'Media','Edit Image'=>'Afbeelding bewerken','Caption'=>'Bijschrift','Alignment'=>'Uitlijning','Size'=>'Grootte','Full Size'=>'Volledige grootte','Medium'=>'Gemiddeld','Right'=>'Rechts','Center'=>'Gecentreerd','Left'=>'Links','Saved.'=>'Opgeslagen.','Add Media'=>'Media toevoegen','File “%s” is not an image.'=>'Bestand “%s” is geen afbeelding.','The GD image library is not installed.'=>'De GD afbeelding bibliotheek is niet geïnstalleerd.','File “%s” does not exist?'=>'Bestand “%s” bestaat niet?','Thumbnail'=>'Thumbnail','Scale'=>'Schaal','Redo'=>'Opnieuw','Password'=>'Wachtwoord','Username'=>'Gebruikersnaam','Archives'=>'Archieven','Sidebar'=>'Zijbalk','Unknown Feed'=>'Onbekende feed','Install'=>'Installeren','Number of comments to show:'=>'Aantal te tonen reacties:','Trackback'=>'Trackback','Pingback'=>'Pingback','Reply'=>'Beantwoorden','Save Draft'=>'Concept opslaan','Tags'=>'Tags','Content'=>'Inhoud','Cancel'=>'Annuleren','Plugins'=>'Plugins','Recent Comments'=>'Recente reacties','Preview'=>'Voorbeeld','RSS'=>'RSS','Submit'=>'Verzenden','Anonymous'=>'Anoniem','Done'=>'Klaar','Users'=>'Gebruikers','Edit Post'=>'Bericht bewerken','View Post'=>'Bericht bekijken','Edit Tag'=>'Tag bewerken','None'=>'Geen','Description'=>'Beschrijving','Name'=>'Naam','Advanced'=>'Geavanceerd','Target'=>'Doel','Categories'=>'Categorieën','Save'=>'Opslaan','Add Link'=>'Link toevoegen','Update Category'=>'Categorie updaten','Edit Link Category'=>'Linkcategorie bewerken','Delete'=>'Verwijderen','Search Categories'=>'Categorieën zoeken','Link Categories'=>'Linkcategorieën','Revisions'=>'Revisies','Excerpt'=>'Samenvatting','Attributes'=>'Attributen','Publish'=>'Publiceren','Comments'=>'Reacties','Apply'=>'Toepassen','Undo'=>'Ongedaan maken','Search Results for “%s”'=>'Zoekresultaten voor “%s”','%s ago'=>'%s geleden','View'=>'Bekijken','Restore'=>'Herstellen','Edit'=>'Bewerken','No'=>'Nee','Are you sure you want to do this?'=>'Weet je zeker dat je dit wil doen?','nounComment'=>'Reactie','URL'=>'URL','Author'=>'Auteur','Log Out'=>'Uitloggen','Visit Site'=>'Site bekijken','Y/m/d'=>'j F Y','Draft'=>'Concept','Pending Review'=>'Wachtend op beoordeling','Published'=>'Gepubliceerd','Title'=>'Titel','No posts found.'=>'Geen berichten gevonden.','Password:'=>'Wachtwoord:','Username:'=>'Gebruikersnaam:','An error occurred during the activation'=>'Er is een fout opgetreden bij de activering','Your account is now active!'=>'Je account is nu actief!','Activate'=>'Activeren','Activation Key:'=>'Activeringssleutel:','Activation Key Required'=>'Activatiesleutel vereist']];