207 Commits

Author SHA1 Message Date
Weston Ruter 5f5904f4ab Query: Prevent get_queried_object() from returning false.
The documented return type is `WP_Term|WP_Post_Type|WP_Post|WP_User|null`, but `get_queried_object()` could return `false` from author queries because `get_userdata()` yields `false` when the resolved author ID is `null` or matches no user. Guard the `get_userdata()` call and its result so `$this->queried_object` stays `null` in those cases. The adjacent posts page branch is hardened the same way, since `get_post()` can return `null` for a missing or deleted page, which previously caused a property access on `null`.

Developed in https://github.com/WordPress/wordpress-develop/pull/12069.
Follow-up to r52822, r3290.

Props tusharbharti, tommusrhodus, yusufmudagal, westonruter.
Fixes #65400.

Built from https://develop.svn.wordpress.org/trunk@62476


git-svn-id: http://core.svn.wordpress.org/trunk@61757 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2026-06-09 03:36:43 +00:00
Sergey Biryukov 565730bff4 Docs: Fix typo in WP_Query post-loading comment.
Follow-up to [59993].

Props parinpanjari, gaurangsondagar, westonruter, SergeyBiryukov.
Fixes #65113.
Built from https://develop.svn.wordpress.org/trunk@62429


git-svn-id: http://core.svn.wordpress.org/trunk@61710 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2026-05-28 22:44:43 +00:00
Sergey Biryukov 70526b0030 Query: Check that taxonomy query var is a string in WP_Query::parse_tax_query().
This prevents a fatal error from `urldecode()` in `wp_basename()` if an array is passed instead.

Follow-up to [15732], [15824], [15825], [15923], [16155], [50565], [60927].

Props patricedefago, alexodiy, SergeyBiryukov.
Fixes #64870.
Built from https://develop.svn.wordpress.org/trunk@62047


git-svn-id: http://core.svn.wordpress.org/trunk@61329 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2026-03-18 21:03:50 +00:00
Sergey Biryukov cc4246cd13 Docs: Correct duplicate hook references in various files.
This commit adjusts cross-reference comments where the hook was moved to a different file but the cross-reference was not updated.

Props apermo, mukesh27.
See #64224.
Built from https://develop.svn.wordpress.org/trunk@61878


git-svn-id: http://core.svn.wordpress.org/trunk@61160 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2026-03-10 11:43:18 +00:00
Sergey Biryukov 20187b42a1 Code Quality: Correct return statement in WP_Query::setup_postdata().
This reflects that the method can return both `true` (success) and `false` (failure).

Follow-up to [32620], [34089], [44941].

Props huzaifaalmesbah, westonruter.
See #64238.
Built from https://develop.svn.wordpress.org/trunk@61727


git-svn-id: http://core.svn.wordpress.org/trunk@61034 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2026-02-24 22:44:32 +00:00
Weston Ruter b16782f28e Formatting: Deprecate the addslashes_gpc() function.
This deprecates `addslashes_gpc()` in favor of `wp_slash()`, as the former is just a wrapper for the latter. The three remaining uses of `addslashes_gpc()` (in `WP_Query`) have been replaced with `wp_slash()`. Unit tests are added to verify that they have the same behavior.

Developed in https://github.com/WordPress/wordpress-develop/pull/10771

Follow-up to [23591], [23555].

Props rutviksavsani, audrasjb, westonruter, mindctrl, johnbillion.
See #21767.
Fixes #64539.

Built from https://develop.svn.wordpress.org/trunk@61590


git-svn-id: http://core.svn.wordpress.org/trunk@60901 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2026-02-04 18:52:49 +00:00
Weston Ruter 964bcaf172 Code Modernization: Replace if statements with null coalescing operator.
Developed in https://github.com/WordPress/wordpress-develop/pull/10703

Follow-up to [61464], [61463], [61457], [61456], [61455], [61454], [61453], [61445], [61444], [61443], [61442], [61436], [61435], [61434], [61403], [61433], [61432], [61431], [61430], [61429], [61424], [61404], [61403].

Props soean, westonruter, mukesh27.
See #58874.
Fixes #64488.

Built from https://develop.svn.wordpress.org/trunk@61470


git-svn-id: http://core.svn.wordpress.org/trunk@60782 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2026-01-11 06:50:42 +00:00
John Blackbourn 5f67927f8b Docs: Correct the documented value ranges for query parameters relating to week numbers.
See #64224

Built from https://develop.svn.wordpress.org/trunk@61449


git-svn-id: http://core.svn.wordpress.org/trunk@60761 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2026-01-08 00:49:56 +00:00
Sergey Biryukov e1e3fc707b Code Modernization: Replace some isset() ternary checks with null coalescing.
Since PHP 7.0 introduced the [https://www.php.net/manual/en/migration70.new-features.php#migration70.new-features.null-coalesce-op null coalescing operator], and WordPress now requires at least PHP 7.2.24, `isset( $var ) ? $var : null` ternary checks can be safely replaced with the more concise `$var ?? null` syntax.

As some new code using the null coalescing operator has already been introduced into core in recent releases, this commit continues with the code modernization by implementing incremental changes for easier review.

Props seanwei, getsyash, krupalpanchal, wildworks, jorbin, SergeyBiryukov.
Fixes #63430. See #58874.
Built from https://develop.svn.wordpress.org/trunk@61403


git-svn-id: http://core.svn.wordpress.org/trunk@60715 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2025-12-22 23:14:38 +00:00
John Blackbourn 133d50d5a2 Docs: Miscellaneous improvements and corrections to inline documentation.
See #64224

Built from https://develop.svn.wordpress.org/trunk@61387


git-svn-id: http://core.svn.wordpress.org/trunk@60699 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2025-12-16 20:21:37 +00:00
Weston Ruter 76ee0ab4bc Docs: Update various class @var tags to indicate nullability.
This updates various `@var` tags on class properties to correctly indicate that the props may be `null` or unset:

* `WP_Dependencies::$all_queued_deps` is nullable by both `::enqueue()` and `::dequeue`. Also, the types of the keys and values are specified. 
* `WP_Duotone::$global_styles_presets` and `::$global_styles_block_names` start off unset and are only initialized by static classes.
* `WP_Query::init()` and `WP_Rewrite::init()` are public methods that `unset()`s many class props.
* `WP_Theme::cache_delete()` sets many props to `null`.

Developed in https://github.com/WordPress/wordpress-develop/pull/8953

Props justlevine, westonruter.
See #64238, #64224.

Built from https://develop.svn.wordpress.org/trunk@61299


git-svn-id: http://core.svn.wordpress.org/trunk@60611 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2025-11-25 02:00:36 +00:00
Weston Ruter ff4d53b52a Coding Standards: Rename abbreviated variable in WP_Query code comment.
This was missed as part of renaming `$q` to `$query_vars`.

Follow-up to [60927].

Props westonruter.
See #63168.

Built from https://develop.svn.wordpress.org/trunk@61044


git-svn-id: http://core.svn.wordpress.org/trunk@60380 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2025-10-22 06:30:30 +00:00
ramonopoly 3770a519d6 Query: fix undefined variable $q in WP_Query::generate_cache_key()
The `generate_cache_key()` method in `WP_Query` referenced an undefined variable `$q`. The method only has two parameters: `$args` and `$sql`. The variable `$q` is not defined anywhere in this method scope. This patch replaces the undefined `$q` variable with the correct `$args` parameter.

Follow-up to [59442]

Props ramonopoly, westonruter

Fixes #64135.


Built from https://develop.svn.wordpress.org/trunk@61043


git-svn-id: http://core.svn.wordpress.org/trunk@60379 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2025-10-22 06:20:32 +00:00
Peter Wilson b0e11252f9 Coding Standards: Rename abbreviated variables in WP_Query.
Renames the locally scoped references to `WP_Query::$query_vars` from `$q`/`$qv` to `$query_vars` for clarity per the coding standards' [https://developer.wordpress.org/coding-standards/wordpress-coding-standards/php/#naming-conventions naming conventions]:

> Don’t abbreviate variable names unnecessarily; let the code be unambiguous and self-documenting.

See #63168.

Built from https://develop.svn.wordpress.org/trunk@60927


git-svn-id: http://core.svn.wordpress.org/trunk@60263 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2025-10-13 21:39:27 +00:00
spacedmonkey 6c7025eeb5 Caching API: Use consistent cache keys for query groups.
Query-based caches are now improved by reusing cache keys. Previously, cache keys for query caches were generated using the `last_changed` value as part of the key. This meant that whenever `last_changed` was updated, all the previously cached values for the group became unreachable.

The new approach allows WordPress to replace previously cached results that are known to be stale. The previous approach relied on the object cache backend evicting stale keys which is done at various levels of efficiency.

To address this, the following new helper functions have been introduced:

* wp_cache_get_salted
* wp_cache_set_salted
* wp_cache_get_multiple_salted
* wp_cache_set_multiple_salted 

These functions provide a consistent way to get/set query caches. Instead of using the last_changed value as part of the cache key, it is now stored inside the cache value as a "salt". This allows cache keys to be reused, with values updated in place rather than relying on eviction of outdated entries.

Props spacedmonkey, peterwilsoncc, flixos90, sanchothefat, tillkruess, rmccue, mukesh27, adamsilverstein, owi, nickchomey.
Built from https://develop.svn.wordpress.org/trunk@60697


git-svn-id: http://core.svn.wordpress.org/trunk@60033 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2025-08-31 21:43:30 +00:00
Aaron Jorbin 27b54d1c50 Documentation: Fix typo inside WP_Query::generate_cache_key.
While the 2022 and 2024 Mariano Rivera AL Reliever of the Year is named Clase, that's not relevant to the generation of cache keys and has nothing to do with orderby.

Introduced in [59766].

Props marian1, abcd95, sabernhardt.
Fixes #63679.

Built from https://develop.svn.wordpress.org/trunk@60444


git-svn-id: http://core.svn.wordpress.org/trunk@59780 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2025-07-09 21:32:30 +00:00
Aaron Jorbin c9d7937947 Coding Standards: Fix alignment in WP_Query::parse_tax_query.
Follow-up to [59766].

See #59516, #62279.

Built from https://develop.svn.wordpress.org/trunk@60048


git-svn-id: http://core.svn.wordpress.org/trunk@59384 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2025-03-18 23:34:26 +00:00
Peter Wilson 1523f87bc8 Query: Fix performance regression starting the loop for all fields.
Fixes a performance regression starting the loop after calling `WP_Query( [ 'fields' => 'all' ] )`. This changes how `WP_Query::the_post()` determines whether there is a need to traverse the posts for cache warming.

If IDs are queried, `WP_Query::$posts` is assumed to be an array of post IDs. If all fields are queried, `WP_Query::$posts` is assumed to be an array of fully populated post objects.

Follow up to [59919], [59937].

Props joemcgill, peterwilsoncc, SirLouen.
Fixes #56992.


Built from https://develop.svn.wordpress.org/trunk@59993


git-svn-id: http://core.svn.wordpress.org/trunk@59335 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2025-03-16 22:57:28 +00:00
Sergey Biryukov 414951bc87 Coding Standards: Use strict comparison in WP_Query::get_posts(), take 1.
Follow-up to [4112], [17552], [19918], [20740], [56513], [56656].

Props aristath, poena, afercia, SergeyBiryukov.
See #62279.
Built from https://develop.svn.wordpress.org/trunk@59976


git-svn-id: http://core.svn.wordpress.org/trunk@59318 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2025-03-12 20:12:32 +00:00
Peter Wilson 95a17be627 Query: Ensure preview links show autosave content to logged in users.
Ensures that the global post object is populated with the autosave post when a preview link is used for a published post. This allows post authors to preview the changes to a post prior to publication.

This modifies `WP_Query::the_post()` to only call `get_post()` if `WP_Query::$posts` does not contain `WP_Post` objects. Other data types (`stdClass` or numeric) indicates partial data was queried, a `WP_Post` object indicates the full data was queried and populated.

Props peterwilsoncc, mamaduka, wildworks, audrasjb.
Fixes #56992.

Built from https://develop.svn.wordpress.org/trunk@59937


git-svn-id: http://core.svn.wordpress.org/trunk@59279 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2025-03-05 22:14:23 +00:00
Peter Wilson d57ecb8b98 Query: Ensure secondary loops populate the full global post.
Modifies `WP_Query::the_post()` to ensure the entire global post object is populated regardless of the `fields` parameter initially set by the developer.

In secondary loops, this ensures that `get_the_content()` and other getter functions operate as documented when called without a post ID and return the appropriate data for the global post object.

This introduces consistency when starting the loop and the `fields` parameter is set to `id=>parent` to the behaviour when set to either `all` or `ids`.

There is no change to the `WP_Query::$posts` parameter nor when a query is made without starting the secondary loop, ie without calling `WP_Query::the_post()`.

Props juzar, mukesh27, oglekler, peterwilsoncc, sirlouen, joemcgill.
Fixes #56992.


Built from https://develop.svn.wordpress.org/trunk@59919


git-svn-id: http://core.svn.wordpress.org/trunk@59261 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2025-03-03 21:45:21 +00:00
Sergey Biryukov b87e7301ad Coding Standards: Use strict comparison in WP_Query::the_comment() and ::have_comments().
Follow-up to [4934].

Props aristath, poena, afercia, SergeyBiryukov.
See #62279.
Built from https://develop.svn.wordpress.org/trunk@59796


git-svn-id: http://core.svn.wordpress.org/trunk@59138 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2025-02-10 10:51:25 +00:00
Sergey Biryukov 770eb818a4 Coding Standards: Use strict comparison in WP_Query::the_post() and ::have_posts().
Follow-up to [2716], [2741], [11464].

Props aristath, poena, afercia, SergeyBiryukov.
See #62279.
Built from https://develop.svn.wordpress.org/trunk@59792


git-svn-id: http://core.svn.wordpress.org/trunk@59134 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2025-02-09 18:51:21 +00:00
Sergey Biryukov d76c427a42 Coding Standards: Use strict comparison in WP_Query::is_page() and ::is_single().
Follow-up to [29039].

Props aristath, poena, afercia, SergeyBiryukov.
See #62279.
Built from https://develop.svn.wordpress.org/trunk@59788


git-svn-id: http://core.svn.wordpress.org/trunk@59130 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2025-02-08 15:32:24 +00:00
Peter Wilson 55f06e4f34 Query: Add since annotation to WP_Query::$query_cache_key.
Follow up to [59766].

Props mukesh27.
See #59516.

Built from https://develop.svn.wordpress.org/trunk@59771


git-svn-id: http://core.svn.wordpress.org/trunk@59113 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2025-02-06 20:58:23 +00:00
Peter Wilson 38025026ac Query: Increase WP_Query cache hits for equivalent arguments.
Introduces normalization a number of arguments passed to `WP_Query` to increase cache hits for equivalent requests. For example `author__in => [ 1, 2 ]` and `author__in => [ 2, 1 ]` will now hit the same cache.

Prior to generating the SQL request and cache key, the following are sorted, made unique and type cast as appropriate.

* `post_type` when passed as an array
* `post_status` when passed as an array
* `term_query`s containing `terms`
* `cat`
* `category__in`
* `category__not_in`
* `category__and`
* `tag_slug__in`
* `tag__in`
* `tag__not_in`
* `tag__and`
* `tag_slug__in`
* `tag_slug__and`
* `post_parent__not_in`
* `author`
* `author__not_in`
* `author__in`

The following are sorted for the purposes of generating the cache key and SQL `WHERE` clause but unmodified for use in the `ORDER BY` SQL clause:

* `post_name__in`
* `post__in`
* `post_parent__in`

This commit includes changes to unrelated tests, assertions in  `Tests_Query_ParseQuery::test_parse_query_cat_array_mixed()` and `WP_Test_REST_Posts_Controller::test_get_items_not_sticky_with_exclude()` have been modified to account for the sorting of the items above.

Props thekt12, peterwilsoncc, spacedmonkey, joemcgill, flixos90, mukesh27, pbearne, swissspidy.
Fixes #59516.

Built from https://develop.svn.wordpress.org/trunk@59766


git-svn-id: http://core.svn.wordpress.org/trunk@59108 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2025-02-06 05:04:24 +00:00
Sergey Biryukov ebce351835 Docs: Add missing @var tag for WP_Query::$query_vars_changed.
Follow-up to [17552].

Props marian1, jigar-bhanushali, martin.krcho, parthvataliya.
Fixes #62022.
Built from https://develop.svn.wordpress.org/trunk@59495


git-svn-id: http://core.svn.wordpress.org/trunk@58881 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2024-12-05 22:05:20 +00:00
Sergey Biryukov 2dfcb9ea56 Coding Standards: Explicitly return false in magic __isset() methods.
This commit fixes an issue where some magic `__isset()` methods were potentially returning `void` (if the prop is not in an allow-listed array of fields) instead of an explicit boolean `false`.

Addressed methods:
* `WP_Comment::__isset()`
* `WP_Query::__isset()`

Follow-up to [28523], [31151], [34583], [34599].

Props justlevine.
See #52217.
Built from https://develop.svn.wordpress.org/trunk@59337


git-svn-id: http://core.svn.wordpress.org/trunk@58723 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2024-11-03 23:03:19 +00:00
spacedmonkey 90de126bd5 Query: Add more context to the split_the_query filter.
Add more context to the `split_the_query` filter by adding two new parameters: '$old_request' and '$clauses'. This enriches the filter with additional information about the SQL query before the query is run, enabling developers to have more context to help decide if a query should be split. 

Props spacedmonkey, shailu25, rcorrales, tillkruess.
Fixes #59514.
Built from https://develop.svn.wordpress.org/trunk@58180


git-svn-id: http://core.svn.wordpress.org/trunk@57643 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2024-05-20 21:21:16 +00:00
spacedmonkey 5208140670 Query: Improve cache key generation.
Query caching in `WP_Query` was added in [53941]. When this functionality was added to the `WP_Query` class, a number of edge cases were missed that would result in redundant duplicate queries. It was possible to pass parameters to `WP_Query` that would be different but would result in the same database query being generated. As the cache key is generated from a mixture of query arguments and the SQL query, this resulted in different cache keys for the same database query, resulting in unnecessary duplicate queries. In this change, the logic in the `generate_cache_key` method has been improved to ensure reuse of existing caches. The following edge cases have been considered:

- Passing `post_type` as an empty string.
- Passing `post_type` as the string `any`.
- Passing `post_type` as array vs. string.
- Passing `post_type` as an array in a different order.
- Not passing `orderby`.
- Passing `post_status` as an array vs. string.
- Passing `post_status` as an array in a different order.

This change also fixes an issue where the old SQL query would not match, as the queries had different whitespaces. 

Props spacedmonkey, joemcgill, pbearne, peterwilsoncc, rajinsharwar, mukesh27, thekt12, huzaifaalmesbah, rodionov201.
Fixes #59442.
Built from https://develop.svn.wordpress.org/trunk@58122


git-svn-id: http://core.svn.wordpress.org/trunk@57587 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2024-05-08 22:51:18 +00:00
audrasjb bf79d8bb2c Docs: Update WP_Query::tax_query docblock to reflect that the property can be null.
Props manooweb, swissspidy.
Fixes #60563.




Built from https://develop.svn.wordpress.org/trunk@57761


git-svn-id: http://core.svn.wordpress.org/trunk@57262 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2024-03-04 14:48:13 +00:00
Pascal Birchler 02d60b4eb4 Query: Remove leading whitespace from certain database queries.
Unintended leading whitespace at the beginning of a raw MySQL query led to unexpected behavior such as broken pagination. Eliminating said whitespace avoids that.

Adds unit tests to prevent regressions.

Props wpfed, swissspidy, ironprogrammer, tadamarketing, afercia.
Fixes #56841.
Built from https://develop.svn.wordpress.org/trunk@57750


git-svn-id: http://core.svn.wordpress.org/trunk@57251 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2024-03-02 13:38:07 +00:00
Pascal Birchler f97698702d General: Consistently cast return value to int in functions that use ceil().
The return value of `ceil()` is still of type `float` as the value range of `float` is usually bigger than that of `int`.

Props crstauf, audrasjb.
Fixes #58683.
Built from https://develop.svn.wordpress.org/trunk@57648


git-svn-id: http://core.svn.wordpress.org/trunk@57149 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2024-02-17 15:24:08 +00:00
Felix Arntz e19c18cba9 Bootstrap/Load: Introduce functions to check whether WordPress is serving a REST API request.
This changeset introduces two functions:
* `wp_is_serving_rest_request()` returns a boolean for whether WordPress is serving an actual REST API request.
* `wp_is_rest_endpoint()` returns a boolean for whether a WordPress REST API endpoint is currently being used. While this is always the case if `wp_is_serving_rest_request()` returns `true`, the function additionally covers the scenario of internal REST API requests, i.e. where WordPress calls a REST API endpoint within the same request.

Both functions should only be used after the `parse_request` action.

All relevant manual checks have been adjusted to use one of the new functions, depending on the use-case. They were all using the same constant check so far, while in fact some of them were intending to check for an actual REST API request while others were intending to check for REST endpoint usage.

A new filter `wp_is_rest_endpoint` can be used to alter the return value of the `wp_is_rest_endpoint()` function.

Props lots.0.logs, TimothyBlynJacobs, flixos90, joehoyle, peterwilsoncc, swissspidy, SergeyBiryukov, pento, mikejolley, iandunn, hellofromTonya, Cybr, petitphp.
Fixes #42061.

Built from https://develop.svn.wordpress.org/trunk@57312


git-svn-id: http://core.svn.wordpress.org/trunk@56818 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2024-01-19 17:40:09 +00:00
Sergey Biryukov a9b08b8e16 Docs: Correct $wp_the_query global reference in WP_Query::is_main_query().
Follow-up to [18699], [32620], [34337], [45739].

See #59651.
Built from https://develop.svn.wordpress.org/trunk@57195


git-svn-id: http://core.svn.wordpress.org/trunk@56706 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-12-17 02:48:29 +00:00
Peter Wilson 4258f31a3b Query: Cache post parent IDs in posts group.
Move the cache of post parent IDs from the dedicated group `post_parents` to `posts`. This maintains backward compatibility for clearing all post object related data by calling `wp_cache_flush_group( 'posts' )`.

Post parent IDs are now cached with with the prefix `post_parent:` in the `posts` group.

Follow up to [56763].

Props spacedmonkey, joemcgill, peterwilsoncc.
See #59188.

Built from https://develop.svn.wordpress.org/trunk@56925


git-svn-id: http://core.svn.wordpress.org/trunk@56436 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-10-12 23:41:23 +00:00
Sergey Biryukov 330f070340 Query: Ensure that the page parameter is scalar in WP_Query::get_posts().
The `page` query var only accepts a scalar value and passes the value through functions that assume a scalar value.

Adding an extra guard condition does not affect its functionality but does avoid a PHP fatal error for `trim()` when a non-scalar value such as an array is passed.

Follow-up to [2535], [53891].

Props brookedot, rlmc, mukesh27, SergeyBiryukov.
Fixes #56558.
Built from https://develop.svn.wordpress.org/trunk@56815


git-svn-id: http://core.svn.wordpress.org/trunk@56327 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-10-10 11:22:24 +00:00
Peter Wilson 61658a27a3 Query: Rename _prime_post_parents_caches() for clarity.
Change the name of `_prime_post_parents_caches()` to `_prime_post_parent_id_caches()` to make it clearer only the parent post ID is cached rather than the entire post parent object.

Follow up to [56763].

Props spacedmonkey, joemcgill, peterwilsoncc.
See #59188.

Built from https://develop.svn.wordpress.org/trunk@56811


git-svn-id: http://core.svn.wordpress.org/trunk@56323 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-10-09 23:04:16 +00:00
spacedmonkey 5283300aac Query: Improve caching behavior for WP_Query when retrieving id=>parent fields
In [53941], the addition of query caching to `WP_Query` brought about an unintended issue when querying for fields equal to id=>parent. Specifically, on websites with object caching enabled and a substantial number of pages, the second run of this query triggered the `_prime_post_caches` function for id=>parent. This led to the unnecessary priming of post, meta, and term caches, even when only id and parent information were requested.

This commit addresses this issue by introducing a new function, `_prime_post_parents_caches`, which primes a dedicated cache for post parents. This cache is primed during the initial query execution. Subsequently, the `wp_cache_get_multiple` function is employed to retrieve all post parent data in a single object cache request, optimizing performance.

Additionally, this commit extends the coverage of existing unit tests to ensure the reliability of the changes.

Props kevinfodness, joemcgill, peterwilsoncc, LinSoftware, thekt12, spacedmonkey.
Fixes #59188
Built from https://develop.svn.wordpress.org/trunk@56763


git-svn-id: http://core.svn.wordpress.org/trunk@56275 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-10-03 15:01:21 +00:00
spacedmonkey d211ad45b1 Query: Improved handling of filtered queries in WP_Query.
The `WP_Query` class enables developers to customize queries using filters like `posts_fields_request`, `posts_request`, and `the_posts`, which can modify both the queried fields and retrieved post objects. In some cases with these filters, incomplete or invalid post objects lacking essential data may arise. To address this, if any of these filters are active during a query, the `get_posts` method now avoids caching post objects with the usual `update_post_caches` function call, opting for a call to `_prime_post_caches` instead. This may occasionally trigger new database queries to prime the post data cache. While this enhancement may result in rare additional database queries, it ensures that invalid post objects aren't cached, prioritizing data consistency and integrity in filtered query scenarios.

Props saulirajala, spacedmonkey, flixos90, mukesh27, peterwilsoncc.
Fixes #58599.
Built from https://develop.svn.wordpress.org/trunk@56656


git-svn-id: http://core.svn.wordpress.org/trunk@56168 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-09-21 19:34:18 +00:00
Sergey Biryukov b80ce60f70 Coding Standards: Use pre-increment/decrement for stand-alone statements.
Note: This is enforced by WPCS 3.0.0:

1. There should be no space between an increment/decrement operator and the variable it applies to.
2. Pre-increment/decrement should be favoured over post-increment/decrement for stand-alone statements. “Pre” will in/decrement and then return, “post” will return and then in/decrement. Using the “pre” version is slightly more performant and can prevent future bugs when code gets moved around.

References:
* [https://developer.wordpress.org/coding-standards/wordpress-coding-standards/php/#increment-decrement-operators WordPress PHP Coding Standards: Increment/decrement operators]
* [https://github.com/WordPress/WordPress-Coding-Standards/pull/2130 WPCS: PR #2130 Core: add sniffs to check formatting of increment/decrement operators]

Props jrf.
See #59161, #58831.
Built from https://develop.svn.wordpress.org/trunk@56549


git-svn-id: http://core.svn.wordpress.org/trunk@56061 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-09-09 09:28:26 +00:00
spacedmonkey ed6e84c280 Query: Use split queries in WP_Query if persistent object caching is enabled.
Prior to this commit, the `WP_Query` class split the query for posts into two database queries. First, it initiated an ID-based query to retrieve post IDs, followed by a call to _prime_post_caches to fetch post objects if they weren't already in memory. This splitting of queries was limited to cases where fewer than 500 posts were being requested, to prevent a potentially large database query within the IN statement in _prime_post_caches.

However, this limitation becomes unnecessary when a persistent object cache is enabled, as the post objects can be efficiently retrieved from the fast object cache. This commit transfers the responsibility of fetching posts to the object cache, which not only speeds up the process but also reduces the strain on the database server.

Props peterwilsoncc, spacedmonkey, SergeyBiryukov.
Fixes #57296.
Built from https://develop.svn.wordpress.org/trunk@56513


git-svn-id: http://core.svn.wordpress.org/trunk@56025 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-09-05 12:23:21 +00:00
audrasjb f668df3cec Docs: Wrap inline @see tags in curly braces.
Props costdev, mukesh27.
Fixes #58858.
See #58833.



Built from https://develop.svn.wordpress.org/trunk@56434


git-svn-id: http://core.svn.wordpress.org/trunk@55946 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-08-24 09:01:16 +00:00
audrasjb b696756a61 Docs: Replace multiple single line comments with multi-line comments.
This changeset updates various comments as per WordPress PHP Inline Documentation Standards.
See https://developer.wordpress.org/coding-standards/inline-documentation-standards/php/#5-inline-comments.

Follow-up to [56174], [56175], [56176], [56177].

Props costdev, audrasjb.
See #58459.



Built from https://develop.svn.wordpress.org/trunk@56178


git-svn-id: http://core.svn.wordpress.org/trunk@55690 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-07-09 21:25:23 +00:00
Sergey Biryukov 32e94b4de1 Code Modernization: Use str_starts_with() and str_ends_with() in a few more places.
`str_starts_with()` and `str_ends_with()` were introduced in PHP 8.0 to perform a case-sensitive check indicating if the string to search in (haystack) begins or ends with the given substring (needle).

WordPress core includes a polyfill for these functions on PHP < 8.0 as of WordPress 5.9.

Follow-up to [55990], [56014].

See #58220.
Built from https://develop.svn.wordpress.org/trunk@56019


git-svn-id: http://core.svn.wordpress.org/trunk@55531 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-06-24 16:50:24 +00:00
Sergey Biryukov 1ce5dc7444 Code Modernization: Replace usage of strpos() with str_contains().
`str_contains()` was introduced in PHP 8.0 to perform a case-sensitive check indicating if the string to search in (haystack) contains the given substring (needle).

WordPress core includes a polyfill for `str_contains()` on PHP < 8.0 as of WordPress 5.9.

This commit replaces `false !== strpos( ... )` with `str_contains()` in core files, making the code more readable and consistent, as well as better aligned with modern development practices.

Follow-up to [52039], [52040], [52326], [55703], [55710], [55987].

Props Soean, spacedmonkey, costdev, dingo_d, azaozz, mikeschroder, flixos90, peterwilsoncc, SergeyBiryukov.
Fixes #58206.
Built from https://develop.svn.wordpress.org/trunk@55988


git-svn-id: http://core.svn.wordpress.org/trunk@55500 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-06-22 14:36:26 +00:00
audrasjb b62f326588 Docs: Improve various docblock in WP_Query class, as per docblock standards.
See #57840.


Built from https://develop.svn.wordpress.org/trunk@55887


git-svn-id: http://core.svn.wordpress.org/trunk@55399 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-06-07 06:53:19 +00:00
spacedmonkey 3c5d179fc9 Comments: Deprecate wp_queue_comments_for_comment_meta_lazyload function.
As of [55749] wp_queue_comments_for_comment_meta_lazyload is no longer used in core. This commit, deprecates this function. Update docs and tests accordingly.

Props sh4lin, spacedmonkey, costdev, peterwilsoncc.
Fixes #58301.
Built from https://develop.svn.wordpress.org/trunk@55855


git-svn-id: http://core.svn.wordpress.org/trunk@55367 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-05-25 10:31:23 +00:00
Felix Arntz c6f9238b77 Media: Conditionally skip lazy-loading on images before the loop to improve LCP performance.
When the logic to exclude images that likely appear above the fold from being lazy-loaded was introduced in WordPress 5.9, initially only images that appear within the main query loop were being considered. However, there is a good chance that images above the fold are rendered before the loop starts, for example in the header template part.

It is particularly common for a theme to display the featured image for a single post in the header. Based on HTTP Archive data from February 2023, the majority of LCP images that are still being lazy-loaded on WordPress sites use the `wp-post-image` class, i.e. are featured images.

This changeset enhances the logic in `wp_get_loading_attr_default()` to not lazy-load images that appear within or after the header template part and before the query loop, using a new `WP_Query::$before_loop` property.

For block themes, this was for the most part already addressed in [55318], however this enhancement implements the solution in a more generally applicable way that brings the improvement to classic themes as well.

Props thekt12, flixos90, spacedmonkey, costdev, zunaid321, mukesh27.
Fixes #58211.
See #53675, #56930.

Built from https://develop.svn.wordpress.org/trunk@55847


git-svn-id: http://core.svn.wordpress.org/trunk@55359 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-05-22 19:13:21 +00:00
Weston Ruter 4c2394eed5 General: Use static on closures whenever $this is not used to avoid memory leaks.
Props westonruter, jrf, spacedmonkey.
Fixes #58323.

Built from https://develop.svn.wordpress.org/trunk@55822


git-svn-id: http://core.svn.wordpress.org/trunk@55334 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2023-05-17 22:46:24 +00:00