-
Notifications
You must be signed in to change notification settings - Fork 2.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
61467 - Filter metadata api for site ( network ) meta. #8161
base: trunk
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -3214,3 +3214,126 @@ function wp_autoload_values_to_autoload() { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return array_intersect( $filtered_values, $autoload_values ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Filters site metadata for multisite installations. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* This function is specific to multisite setups and provides a way to retrieve | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* network options. It enforces parameters' constraints and suggests using an alternative function. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param mixed $current The value to return if no changes are made. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param int $object_id Site ID. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param string $meta_key Metadata key. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param bool $single Whether to retrieve a single value. Must be true. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @return mixed The network option value for the specified meta key, or false if the function is used incorrectly. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function filter_get_site_metadata( $current, $object_id, $meta_key, $single ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if ( ! is_multisite() ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_doing_it_wrong( 'get_metadata', __( 'This function is only available in multisite installations.' ), '6.8.0' ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return false; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if ( ! $single ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_doing_it_wrong( 'get_metadata', __( 'The $single parameter is not supported in this function.' ), '6.8.0' ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return $current; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+3239
to
+3240
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. While it is correct that
Here is an example for the 2nd option:
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. If we do this, it would a breaking change. If for some reason you were using network options to store multiple values in the same key, the other keys that become in accessible for this change. My hope is that the doing it wrong, will tell developers to stop doing this and we can change this in the future. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This would only be a breaking change if someone was actually using this to store multiple values - which I doubt is common. Probably the most common usage of the metadata functions for network options is via WP-CLI. I'm on board with not changing the return value here for now to first only warn developers about this. But the warning should only appear if there are actually multiple values stored. The problem is not that someone is calling this function with So we would need to conditionally trigger a warning via another filter, once the value has been retrieved, and only if it's multiple values. Even more important would be to flag this in the filter callback for But here we need basically the same warning, in order to account for data that was already stored before this change. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_doing_it_wrong( 'get_metadata', __( 'This function is deprecated. Use get_network_option() instead.' ), '6.8.0' ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Per my overarching comment, I don't think all those warnings and deprecation messages are needed. We can make this work without them. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I really want to push home to developers, that if you are doing this, you are doing this wrong. But I still want the code to work. If developers know what they are doing and don't care, they can always unhook these filters and do use the metadata api as is. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I agree with you that some of these warnings make sense. But using the metadata functions for network options is not necessarily wrong. It may not be recommended, but for the most part it works. There is only one thing that is wrong: Nobody should be able to store multiple meta values for a single meta key in There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It IS wrong, as caches ( specially if external object caches ) values for options are not updated / created / delete. It also does not run through the existing filters and actions for network options. I think there are serious issues and should be pushing developers to not do this. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return get_network_option( $object_id, $meta_key ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Filters and updates site metadata in a multisite environment. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* This function is only applicable in multisite installations. It has been | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* deprecated in favor of using `update_network_option()`. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param mixed $current The current metadata value. Unused. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param int $object_id Site ID for which the metadata is being updated. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param string $meta_key Metadata key to update. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param mixed $meta_value Metadata value to update. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @return bool|void False if the operation is not applicable or invalid, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* or the result of `update_network_option()` on success. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function filter_update_site_metadata( $current, $object_id, $meta_key, $meta_value ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if ( ! is_multisite() ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_doing_it_wrong( 'update_metadata', __( 'This function is only available in multisite installations.' ), '6.8.0' ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return false; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_doing_it_wrong( 'update_metadata', __( 'This function is deprecated. Use update_network_option() instead.' ), '6.8.0' ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return update_network_option( $object_id, $meta_key, $meta_value ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+3263
to
+3270
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. See above, I think this could simply become:
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Filters the addition of site metadata. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* This function is a custom implementation for adding metadata in a multisite environment. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* It ensures that the metadata API handles this case correctly. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* This function is deprecated and advises using `add_network_option()` instead. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* If WordPress is not running in a multisite environment or if the `$unique` parameter is false, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* it will return `$current` or false as appropriate. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param mixed $current The return value of the original filter function. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param int $object_id ID of the object (site ID). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param string $meta_key Metadata key. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param mixed $meta_value Metadata value. Must be serializable if non-scalar. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param bool $unique Whether the metadata key should be unique. If false, `$current` is returned. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @return bool|mixed False on failure, `$current` if the `$unique` parameter is false, or the result of `add_network_option()`. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function filter_add_site_metadata( $current, $object_id, $meta_key, $meta_value, $unique ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if ( ! is_multisite() ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_doing_it_wrong( 'add_metadata', __( 'This function is only available in multisite installations.' ), '6.8.0' ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return false; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+3291
to
+3294
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. See above: We can remove this check and call |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if ( ! $unique ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_doing_it_wrong( 'get_metadata', __( 'The $unique parameter is not supported in this function.' ), '6.8.0' ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return $current; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+3296
to
+3299
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think we can make this a bit safer: If For example we could do this:
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_doing_it_wrong( 'add_metadata', __( 'This function is deprecated. Use add_network_option() instead.' ), '6.8.0' ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. See above, these deprecation warnings are not necessary, and they would be confusing because those functions are actually not deprecated. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return add_network_option( $object_id, $meta_key, $meta_value ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* Filters site metadata deletion in multisite installations. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* This function ensures that metadata deletion adheres to multisite-specific rules. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* It also deprecates specific parameters and suggests using `delete_network_option()` instead. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param mixed $current The value to return if the function short-circuits. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param int $object_id The object ID, typically the site ID. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param string $meta_key The meta key to delete. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param mixed $meta_value The meta value to delete. Not supported in this function. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @param bool $delete_all Whether to delete the matching metadata entries for all objects, ignoring the object ID. Not supported in this function. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @return mixed The filtered result of the metadata deletion operation. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
function filter_delete_site_metadata( $current, $object_id, $meta_key, $meta_value, $delete_all ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if ( ! is_multisite() ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_doing_it_wrong( 'delete_metadata', __( 'This function is only available in multisite installations.' ), '6.8.0' ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return false; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if ( $delete_all ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_doing_it_wrong( 'delete_metadata', __( 'The $delete_all parameter is not supported in this function.' ), '6.8.0' ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return $current; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if ( $meta_value ) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_doing_it_wrong( 'delete_metadata', __( 'The $meta_value parameter is not supported in this function.' ), '6.8.0' ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return $current; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
_doing_it_wrong( 'delete_metadata', __( 'This function is deprecated. Use delete_network_option() instead.' ), '6.8.0' ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return delete_network_option( $object_id, $meta_key ); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+3321
to
+3338
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Based on the above feedback, this can be simplified to:
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
On non-multisite,
get_network_option()
still works and falls through toget_option()
. So it would make sense to me to align with that. We could remove this condition sinceget_network_option()
already handles it.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think should do that. currently,
get_metadata( 'site', 1, 'site_url' )
in a single site, would result false, as it should. It is start returning the option, than that could be considered a breaking change.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think it's a breaking change to return another value - the function is expected to return anything, so returning anything is not a breaking change. If you argue that way, even using
get_network_option()
here at all would be a breaking change.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am confused by this feedback. Currently if I called
get_metadata( 'site', 1, 'site_url' )
, what happens if is try to load data from the sitemeta table. If table doesn't exist, it will result false. If we useget_network_option
it will load from option the response of the function call goes from false to option value. That is a different and breaking change for the code.