Changeset 33761 for trunk/src/wp-includes/class-wp-meta-query.php
- Timestamp:
- 08/26/2015 01:01:22 PM (10 years ago)
- File:
-
- 1 copied
-
trunk/src/wp-includes/class-wp-meta-query.php (copied) (copied from trunk/src/wp-includes/meta.php) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/wp-includes/class-wp-meta-query.php
r33758 r33761 1 1 <?php 2 /**3 * Metadata API4 *5 * Functions for retrieving and manipulating metadata of various WordPress object types. Metadata6 * for an object is a represented by a simple key-value pair. Objects may contain multiple7 * metadata entries that share the same key and differ only in their value.8 *9 * @package WordPress10 * @subpackage Meta11 * @since 2.9.012 */13 14 /**15 * Add metadata for the specified object.16 *17 * @since 2.9.018 *19 * @global wpdb $wpdb WordPress database abstraction object.20 *21 * @param string $meta_type Type of object metadata is for (e.g., comment, post, or user)22 * @param int $object_id ID of the object metadata is for23 * @param string $meta_key Metadata key24 * @param mixed $meta_value Metadata value. Must be serializable if non-scalar.25 * @param bool $unique Optional, default is false.26 * Whether the specified metadata key should be unique for the object.27 * If true, and the object already has a value for the specified metadata key,28 * no change will be made.29 * @return int|false The meta ID on success, false on failure.30 */31 function add_metadata($meta_type, $object_id, $meta_key, $meta_value, $unique = false) {32 global $wpdb;33 34 if ( ! $meta_type || ! $meta_key || ! is_numeric( $object_id ) ) {35 return false;36 }37 38 $object_id = absint( $object_id );39 if ( ! $object_id ) {40 return false;41 }42 43 $table = _get_meta_table( $meta_type );44 if ( ! $table ) {45 return false;46 }47 48 $column = sanitize_key($meta_type . '_id');49 50 // expected_slashed ($meta_key)51 $meta_key = wp_unslash($meta_key);52 $meta_value = wp_unslash($meta_value);53 $meta_value = sanitize_meta( $meta_key, $meta_value, $meta_type );54 55 /**56 * Filter whether to add metadata of a specific type.57 *58 * The dynamic portion of the hook, `$meta_type`, refers to the meta59 * object type (comment, post, or user). Returning a non-null value60 * will effectively short-circuit the function.61 *62 * @since 3.1.063 *64 * @param null|bool $check Whether to allow adding metadata for the given type.65 * @param int $object_id Object ID.66 * @param string $meta_key Meta key.67 * @param mixed $meta_value Meta value. Must be serializable if non-scalar.68 * @param bool $unique Whether the specified meta key should be unique69 * for the object. Optional. Default false.70 */71 $check = apply_filters( "add_{$meta_type}_metadata", null, $object_id, $meta_key, $meta_value, $unique );72 if ( null !== $check )73 return $check;74 75 if ( $unique && $wpdb->get_var( $wpdb->prepare(76 "SELECT COUNT(*) FROM $table WHERE meta_key = %s AND $column = %d",77 $meta_key, $object_id ) ) )78 return false;79 80 $_meta_value = $meta_value;81 $meta_value = maybe_serialize( $meta_value );82 83 /**84 * Fires immediately before meta of a specific type is added.85 *86 * The dynamic portion of the hook, `$meta_type`, refers to the meta87 * object type (comment, post, or user).88 *89 * @since 3.1.090 *91 * @param int $object_id Object ID.92 * @param string $meta_key Meta key.93 * @param mixed $meta_value Meta value.94 */95 do_action( "add_{$meta_type}_meta", $object_id, $meta_key, $_meta_value );96 97 $result = $wpdb->insert( $table, array(98 $column => $object_id,99 'meta_key' => $meta_key,100 'meta_value' => $meta_value101 ) );102 103 if ( ! $result )104 return false;105 106 $mid = (int) $wpdb->insert_id;107 108 wp_cache_delete($object_id, $meta_type . '_meta');109 110 /**111 * Fires immediately after meta of a specific type is added.112 *113 * The dynamic portion of the hook, `$meta_type`, refers to the meta114 * object type (comment, post, or user).115 *116 * @since 2.9.0117 *118 * @param int $mid The meta ID after successful update.119 * @param int $object_id Object ID.120 * @param string $meta_key Meta key.121 * @param mixed $meta_value Meta value.122 */123 do_action( "added_{$meta_type}_meta", $mid, $object_id, $meta_key, $_meta_value );124 125 return $mid;126 }127 128 /**129 * Update metadata for the specified object. If no value already exists for the specified object130 * ID and metadata key, the metadata will be added.131 *132 * @since 2.9.0133 *134 * @global wpdb $wpdb WordPress database abstraction object.135 *136 * @param string $meta_type Type of object metadata is for (e.g., comment, post, or user)137 * @param int $object_id ID of the object metadata is for138 * @param string $meta_key Metadata key139 * @param mixed $meta_value Metadata value. Must be serializable if non-scalar.140 * @param mixed $prev_value Optional. If specified, only update existing metadata entries with141 * the specified value. Otherwise, update all entries.142 * @return int|bool Meta ID if the key didn't exist, true on successful update, false on failure.143 */144 function update_metadata($meta_type, $object_id, $meta_key, $meta_value, $prev_value = '') {145 global $wpdb;146 147 if ( ! $meta_type || ! $meta_key || ! is_numeric( $object_id ) ) {148 return false;149 }150 151 $object_id = absint( $object_id );152 if ( ! $object_id ) {153 return false;154 }155 156 $table = _get_meta_table( $meta_type );157 if ( ! $table ) {158 return false;159 }160 161 $column = sanitize_key($meta_type . '_id');162 $id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id';163 164 // expected_slashed ($meta_key)165 $meta_key = wp_unslash($meta_key);166 $passed_value = $meta_value;167 $meta_value = wp_unslash($meta_value);168 $meta_value = sanitize_meta( $meta_key, $meta_value, $meta_type );169 170 /**171 * Filter whether to update metadata of a specific type.172 *173 * The dynamic portion of the hook, `$meta_type`, refers to the meta174 * object type (comment, post, or user). Returning a non-null value175 * will effectively short-circuit the function.176 *177 * @since 3.1.0178 *179 * @param null|bool $check Whether to allow updating metadata for the given type.180 * @param int $object_id Object ID.181 * @param string $meta_key Meta key.182 * @param mixed $meta_value Meta value. Must be serializable if non-scalar.183 * @param mixed $prev_value Optional. If specified, only update existing184 * metadata entries with the specified value.185 * Otherwise, update all entries.186 */187 $check = apply_filters( "update_{$meta_type}_metadata", null, $object_id, $meta_key, $meta_value, $prev_value );188 if ( null !== $check )189 return (bool) $check;190 191 // Compare existing value to new value if no prev value given and the key exists only once.192 if ( empty($prev_value) ) {193 $old_value = get_metadata($meta_type, $object_id, $meta_key);194 if ( count($old_value) == 1 ) {195 if ( $old_value[0] === $meta_value )196 return false;197 }198 }199 200 $meta_ids = $wpdb->get_col( $wpdb->prepare( "SELECT $id_column FROM $table WHERE meta_key = %s AND $column = %d", $meta_key, $object_id ) );201 if ( empty( $meta_ids ) ) {202 return add_metadata($meta_type, $object_id, $meta_key, $passed_value);203 }204 205 $_meta_value = $meta_value;206 $meta_value = maybe_serialize( $meta_value );207 208 $data = compact( 'meta_value' );209 $where = array( $column => $object_id, 'meta_key' => $meta_key );210 211 if ( !empty( $prev_value ) ) {212 $prev_value = maybe_serialize($prev_value);213 $where['meta_value'] = $prev_value;214 }215 216 foreach ( $meta_ids as $meta_id ) {217 /**218 * Fires immediately before updating metadata of a specific type.219 *220 * The dynamic portion of the hook, `$meta_type`, refers to the meta221 * object type (comment, post, or user).222 *223 * @since 2.9.0224 *225 * @param int $meta_id ID of the metadata entry to update.226 * @param int $object_id Object ID.227 * @param string $meta_key Meta key.228 * @param mixed $meta_value Meta value.229 */230 do_action( "update_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $_meta_value );231 }232 233 if ( 'post' == $meta_type ) {234 foreach ( $meta_ids as $meta_id ) {235 /**236 * Fires immediately before updating a post's metadata.237 *238 * @since 2.9.0239 *240 * @param int $meta_id ID of metadata entry to update.241 * @param int $object_id Object ID.242 * @param string $meta_key Meta key.243 * @param mixed $meta_value Meta value.244 */245 do_action( 'update_postmeta', $meta_id, $object_id, $meta_key, $meta_value );246 }247 }248 249 $result = $wpdb->update( $table, $data, $where );250 if ( ! $result )251 return false;252 253 wp_cache_delete($object_id, $meta_type . '_meta');254 255 foreach ( $meta_ids as $meta_id ) {256 /**257 * Fires immediately after updating metadata of a specific type.258 *259 * The dynamic portion of the hook, `$meta_type`, refers to the meta260 * object type (comment, post, or user).261 *262 * @since 2.9.0263 *264 * @param int $meta_id ID of updated metadata entry.265 * @param int $object_id Object ID.266 * @param string $meta_key Meta key.267 * @param mixed $meta_value Meta value.268 */269 do_action( "updated_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $_meta_value );270 }271 272 if ( 'post' == $meta_type ) {273 foreach ( $meta_ids as $meta_id ) {274 /**275 * Fires immediately after updating a post's metadata.276 *277 * @since 2.9.0278 *279 * @param int $meta_id ID of updated metadata entry.280 * @param int $object_id Object ID.281 * @param string $meta_key Meta key.282 * @param mixed $meta_value Meta value.283 */284 do_action( 'updated_postmeta', $meta_id, $object_id, $meta_key, $meta_value );285 }286 }287 288 return true;289 }290 291 /**292 * Delete metadata for the specified object.293 *294 * @since 2.9.0295 *296 * @global wpdb $wpdb WordPress database abstraction object.297 *298 * @param string $meta_type Type of object metadata is for (e.g., comment, post, or user)299 * @param int $object_id ID of the object metadata is for300 * @param string $meta_key Metadata key301 * @param mixed $meta_value Optional. Metadata value. Must be serializable if non-scalar. If specified, only delete302 * metadata entries with this value. Otherwise, delete all entries with the specified meta_key.303 * Pass `null, `false`, or an empty string to skip this check. (For backward compatibility,304 * it is not possible to pass an empty string to delete those entries with an empty string305 * for a value.)306 * @param bool $delete_all Optional, default is false. If true, delete matching metadata entries for all objects,307 * ignoring the specified object_id. Otherwise, only delete matching metadata entries for308 * the specified object_id.309 * @return bool True on successful delete, false on failure.310 */311 function delete_metadata($meta_type, $object_id, $meta_key, $meta_value = '', $delete_all = false) {312 global $wpdb;313 314 if ( ! $meta_type || ! $meta_key || ! is_numeric( $object_id ) && ! $delete_all ) {315 return false;316 }317 318 $object_id = absint( $object_id );319 if ( ! $object_id && ! $delete_all ) {320 return false;321 }322 323 $table = _get_meta_table( $meta_type );324 if ( ! $table ) {325 return false;326 }327 328 $type_column = sanitize_key($meta_type . '_id');329 $id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id';330 // expected_slashed ($meta_key)331 $meta_key = wp_unslash($meta_key);332 $meta_value = wp_unslash($meta_value);333 334 /**335 * Filter whether to delete metadata of a specific type.336 *337 * The dynamic portion of the hook, `$meta_type`, refers to the meta338 * object type (comment, post, or user). Returning a non-null value339 * will effectively short-circuit the function.340 *341 * @since 3.1.0342 *343 * @param null|bool $delete Whether to allow metadata deletion of the given type.344 * @param int $object_id Object ID.345 * @param string $meta_key Meta key.346 * @param mixed $meta_value Meta value. Must be serializable if non-scalar.347 * @param bool $delete_all Whether to delete the matching metadata entries348 * for all objects, ignoring the specified $object_id.349 * Default false.350 */351 $check = apply_filters( "delete_{$meta_type}_metadata", null, $object_id, $meta_key, $meta_value, $delete_all );352 if ( null !== $check )353 return (bool) $check;354 355 $_meta_value = $meta_value;356 $meta_value = maybe_serialize( $meta_value );357 358 $query = $wpdb->prepare( "SELECT $id_column FROM $table WHERE meta_key = %s", $meta_key );359 360 if ( !$delete_all )361 $query .= $wpdb->prepare(" AND $type_column = %d", $object_id );362 363 if ( '' !== $meta_value && null !== $meta_value && false !== $meta_value )364 $query .= $wpdb->prepare(" AND meta_value = %s", $meta_value );365 366 $meta_ids = $wpdb->get_col( $query );367 if ( !count( $meta_ids ) )368 return false;369 370 if ( $delete_all )371 $object_ids = $wpdb->get_col( $wpdb->prepare( "SELECT $type_column FROM $table WHERE meta_key = %s", $meta_key ) );372 373 /**374 * Fires immediately before deleting metadata of a specific type.375 *376 * The dynamic portion of the hook, `$meta_type`, refers to the meta377 * object type (comment, post, or user).378 *379 * @since 3.1.0380 *381 * @param array $meta_ids An array of metadata entry IDs to delete.382 * @param int $object_id Object ID.383 * @param string $meta_key Meta key.384 * @param mixed $meta_value Meta value.385 */386 do_action( "delete_{$meta_type}_meta", $meta_ids, $object_id, $meta_key, $_meta_value );387 388 // Old-style action.389 if ( 'post' == $meta_type ) {390 /**391 * Fires immediately before deleting metadata for a post.392 *393 * @since 2.9.0394 *395 * @param array $meta_ids An array of post metadata entry IDs to delete.396 */397 do_action( 'delete_postmeta', $meta_ids );398 }399 400 $query = "DELETE FROM $table WHERE $id_column IN( " . implode( ',', $meta_ids ) . " )";401 402 $count = $wpdb->query($query);403 404 if ( !$count )405 return false;406 407 if ( $delete_all ) {408 foreach ( (array) $object_ids as $o_id ) {409 wp_cache_delete($o_id, $meta_type . '_meta');410 }411 } else {412 wp_cache_delete($object_id, $meta_type . '_meta');413 }414 415 /**416 * Fires immediately after deleting metadata of a specific type.417 *418 * The dynamic portion of the hook name, `$meta_type`, refers to the meta419 * object type (comment, post, or user).420 *421 * @since 2.9.0422 *423 * @param array $meta_ids An array of deleted metadata entry IDs.424 * @param int $object_id Object ID.425 * @param string $meta_key Meta key.426 * @param mixed $meta_value Meta value.427 */428 do_action( "deleted_{$meta_type}_meta", $meta_ids, $object_id, $meta_key, $_meta_value );429 430 // Old-style action.431 if ( 'post' == $meta_type ) {432 /**433 * Fires immediately after deleting metadata for a post.434 *435 * @since 2.9.0436 *437 * @param array $meta_ids An array of deleted post metadata entry IDs.438 */439 do_action( 'deleted_postmeta', $meta_ids );440 }441 442 return true;443 }444 445 /**446 * Retrieve metadata for the specified object.447 *448 * @since 2.9.0449 *450 * @param string $meta_type Type of object metadata is for (e.g., comment, post, or user)451 * @param int $object_id ID of the object metadata is for452 * @param string $meta_key Optional. Metadata key. If not specified, retrieve all metadata for453 * the specified object.454 * @param bool $single Optional, default is false.455 * If true, return only the first value of the specified meta_key.456 * This parameter has no effect if meta_key is not specified.457 * @return mixed Single metadata value, or array of values458 */459 function get_metadata($meta_type, $object_id, $meta_key = '', $single = false) {460 if ( ! $meta_type || ! is_numeric( $object_id ) ) {461 return false;462 }463 464 $object_id = absint( $object_id );465 if ( ! $object_id ) {466 return false;467 }468 469 /**470 * Filter whether to retrieve metadata of a specific type.471 *472 * The dynamic portion of the hook, `$meta_type`, refers to the meta473 * object type (comment, post, or user). Returning a non-null value474 * will effectively short-circuit the function.475 *476 * @since 3.1.0477 *478 * @param null|array|string $value The value get_metadata() should return - a single metadata value,479 * or an array of values.480 * @param int $object_id Object ID.481 * @param string $meta_key Meta key.482 * @param bool $single Whether to return only the first value of the specified $meta_key.483 */484 $check = apply_filters( "get_{$meta_type}_metadata", null, $object_id, $meta_key, $single );485 if ( null !== $check ) {486 if ( $single && is_array( $check ) )487 return $check[0];488 else489 return $check;490 }491 492 $meta_cache = wp_cache_get($object_id, $meta_type . '_meta');493 494 if ( !$meta_cache ) {495 $meta_cache = update_meta_cache( $meta_type, array( $object_id ) );496 $meta_cache = $meta_cache[$object_id];497 }498 499 if ( ! $meta_key ) {500 return $meta_cache;501 }502 503 if ( isset($meta_cache[$meta_key]) ) {504 if ( $single )505 return maybe_unserialize( $meta_cache[$meta_key][0] );506 else507 return array_map('maybe_unserialize', $meta_cache[$meta_key]);508 }509 510 if ($single)511 return '';512 else513 return array();514 }515 516 /**517 * Determine if a meta key is set for a given object518 *519 * @since 3.3.0520 *521 * @param string $meta_type Type of object metadata is for (e.g., comment, post, or user)522 * @param int $object_id ID of the object metadata is for523 * @param string $meta_key Metadata key.524 * @return bool True of the key is set, false if not.525 */526 function metadata_exists( $meta_type, $object_id, $meta_key ) {527 if ( ! $meta_type || ! is_numeric( $object_id ) ) {528 return false;529 }530 531 $object_id = absint( $object_id );532 if ( ! $object_id ) {533 return false;534 }535 536 /** This filter is documented in wp-includes/meta.php */537 $check = apply_filters( "get_{$meta_type}_metadata", null, $object_id, $meta_key, true );538 if ( null !== $check )539 return (bool) $check;540 541 $meta_cache = wp_cache_get( $object_id, $meta_type . '_meta' );542 543 if ( !$meta_cache ) {544 $meta_cache = update_meta_cache( $meta_type, array( $object_id ) );545 $meta_cache = $meta_cache[$object_id];546 }547 548 if ( isset( $meta_cache[ $meta_key ] ) )549 return true;550 551 return false;552 }553 554 /**555 * Get meta data by meta ID556 *557 * @since 3.3.0558 *559 * @global wpdb $wpdb560 *561 * @param string $meta_type Type of object metadata is for (e.g., comment, post, or user)562 * @param int $meta_id ID for a specific meta row563 * @return object|false Meta object or false.564 */565 function get_metadata_by_mid( $meta_type, $meta_id ) {566 global $wpdb;567 568 if ( ! $meta_type || ! is_numeric( $meta_id ) ) {569 return false;570 }571 572 $meta_id = absint( $meta_id );573 if ( ! $meta_id ) {574 return false;575 }576 577 $table = _get_meta_table( $meta_type );578 if ( ! $table ) {579 return false;580 }581 582 $id_column = ( 'user' == $meta_type ) ? 'umeta_id' : 'meta_id';583 584 $meta = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM $table WHERE $id_column = %d", $meta_id ) );585 586 if ( empty( $meta ) )587 return false;588 589 if ( isset( $meta->meta_value ) )590 $meta->meta_value = maybe_unserialize( $meta->meta_value );591 592 return $meta;593 }594 595 /**596 * Update meta data by meta ID597 *598 * @since 3.3.0599 *600 * @global wpdb $wpdb601 *602 * @param string $meta_type Type of object metadata is for (e.g., comment, post, or user)603 * @param int $meta_id ID for a specific meta row604 * @param string $meta_value Metadata value605 * @param string $meta_key Optional, you can provide a meta key to update it606 * @return bool True on successful update, false on failure.607 */608 function update_metadata_by_mid( $meta_type, $meta_id, $meta_value, $meta_key = false ) {609 global $wpdb;610 611 // Make sure everything is valid.612 if ( ! $meta_type || ! is_numeric( $meta_id ) ) {613 return false;614 }615 616 $meta_id = absint( $meta_id );617 if ( ! $meta_id ) {618 return false;619 }620 621 $table = _get_meta_table( $meta_type );622 if ( ! $table ) {623 return false;624 }625 626 $column = sanitize_key($meta_type . '_id');627 $id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id';628 629 // Fetch the meta and go on if it's found.630 if ( $meta = get_metadata_by_mid( $meta_type, $meta_id ) ) {631 $original_key = $meta->meta_key;632 $object_id = $meta->{$column};633 634 // If a new meta_key (last parameter) was specified, change the meta key,635 // otherwise use the original key in the update statement.636 if ( false === $meta_key ) {637 $meta_key = $original_key;638 } elseif ( ! is_string( $meta_key ) ) {639 return false;640 }641 642 // Sanitize the meta643 $_meta_value = $meta_value;644 $meta_value = sanitize_meta( $meta_key, $meta_value, $meta_type );645 $meta_value = maybe_serialize( $meta_value );646 647 // Format the data query arguments.648 $data = array(649 'meta_key' => $meta_key,650 'meta_value' => $meta_value651 );652 653 // Format the where query arguments.654 $where = array();655 $where[$id_column] = $meta_id;656 657 /** This action is documented in wp-includes/meta.php */658 do_action( "update_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $_meta_value );659 660 if ( 'post' == $meta_type ) {661 /** This action is documented in wp-includes/meta.php */662 do_action( 'update_postmeta', $meta_id, $object_id, $meta_key, $meta_value );663 }664 665 // Run the update query, all fields in $data are %s, $where is a %d.666 $result = $wpdb->update( $table, $data, $where, '%s', '%d' );667 if ( ! $result )668 return false;669 670 // Clear the caches.671 wp_cache_delete($object_id, $meta_type . '_meta');672 673 /** This action is documented in wp-includes/meta.php */674 do_action( "updated_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $_meta_value );675 676 if ( 'post' == $meta_type ) {677 /** This action is documented in wp-includes/meta.php */678 do_action( 'updated_postmeta', $meta_id, $object_id, $meta_key, $meta_value );679 }680 681 return true;682 }683 684 // And if the meta was not found.685 return false;686 }687 688 /**689 * Delete meta data by meta ID690 *691 * @since 3.3.0692 *693 * @global wpdb $wpdb694 *695 * @param string $meta_type Type of object metadata is for (e.g., comment, post, or user)696 * @param int $meta_id ID for a specific meta row697 * @return bool True on successful delete, false on failure.698 */699 function delete_metadata_by_mid( $meta_type, $meta_id ) {700 global $wpdb;701 702 // Make sure everything is valid.703 if ( ! $meta_type || ! is_numeric( $meta_id ) ) {704 return false;705 }706 707 $meta_id = absint( $meta_id );708 if ( ! $meta_id ) {709 return false;710 }711 712 $table = _get_meta_table( $meta_type );713 if ( ! $table ) {714 return false;715 }716 717 // object and id columns718 $column = sanitize_key($meta_type . '_id');719 $id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id';720 721 // Fetch the meta and go on if it's found.722 if ( $meta = get_metadata_by_mid( $meta_type, $meta_id ) ) {723 $object_id = $meta->{$column};724 725 /** This action is documented in wp-includes/meta.php */726 do_action( "delete_{$meta_type}_meta", (array) $meta_id, $object_id, $meta->meta_key, $meta->meta_value );727 728 // Old-style action.729 if ( 'post' == $meta_type || 'comment' == $meta_type ) {730 /**731 * Fires immediately before deleting post or comment metadata of a specific type.732 *733 * The dynamic portion of the hook, `$meta_type`, refers to the meta734 * object type (post or comment).735 *736 * @since 3.4.0737 *738 * @param int $meta_id ID of the metadata entry to delete.739 */740 do_action( "delete_{$meta_type}meta", $meta_id );741 }742 743 // Run the query, will return true if deleted, false otherwise744 $result = (bool) $wpdb->delete( $table, array( $id_column => $meta_id ) );745 746 // Clear the caches.747 wp_cache_delete($object_id, $meta_type . '_meta');748 749 /** This action is documented in wp-includes/meta.php */750 do_action( "deleted_{$meta_type}_meta", (array) $meta_id, $object_id, $meta->meta_key, $meta->meta_value );751 752 // Old-style action.753 if ( 'post' == $meta_type || 'comment' == $meta_type ) {754 /**755 * Fires immediately after deleting post or comment metadata of a specific type.756 *757 * The dynamic portion of the hook, `$meta_type`, refers to the meta758 * object type (post or comment).759 *760 * @since 3.4.0761 *762 * @param int $meta_ids Deleted metadata entry ID.763 */764 do_action( "deleted_{$meta_type}meta", $meta_id );765 }766 767 return $result;768 769 }770 771 // Meta id was not found.772 return false;773 }774 775 /**776 * Update the metadata cache for the specified objects.777 *778 * @since 2.9.0779 *780 * @global wpdb $wpdb WordPress database abstraction object.781 *782 * @param string $meta_type Type of object metadata is for (e.g., comment, post, or user)783 * @param int|array $object_ids Array or comma delimited list of object IDs to update cache for784 * @return array|false Metadata cache for the specified objects, or false on failure.785 */786 function update_meta_cache($meta_type, $object_ids) {787 global $wpdb;788 789 if ( ! $meta_type || ! $object_ids ) {790 return false;791 }792 793 $table = _get_meta_table( $meta_type );794 if ( ! $table ) {795 return false;796 }797 798 $column = sanitize_key($meta_type . '_id');799 800 if ( !is_array($object_ids) ) {801 $object_ids = preg_replace('|[^0-9,]|', '', $object_ids);802 $object_ids = explode(',', $object_ids);803 }804 805 $object_ids = array_map('intval', $object_ids);806 807 $cache_key = $meta_type . '_meta';808 $ids = array();809 $cache = array();810 foreach ( $object_ids as $id ) {811 $cached_object = wp_cache_get( $id, $cache_key );812 if ( false === $cached_object )813 $ids[] = $id;814 else815 $cache[$id] = $cached_object;816 }817 818 if ( empty( $ids ) )819 return $cache;820 821 // Get meta info822 $id_list = join( ',', $ids );823 $id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id';824 $meta_list = $wpdb->get_results( "SELECT $column, meta_key, meta_value FROM $table WHERE $column IN ($id_list) ORDER BY $id_column ASC", ARRAY_A );825 826 if ( !empty($meta_list) ) {827 foreach ( $meta_list as $metarow) {828 $mpid = intval($metarow[$column]);829 $mkey = $metarow['meta_key'];830 $mval = $metarow['meta_value'];831 832 // Force subkeys to be array type:833 if ( !isset($cache[$mpid]) || !is_array($cache[$mpid]) )834 $cache[$mpid] = array();835 if ( !isset($cache[$mpid][$mkey]) || !is_array($cache[$mpid][$mkey]) )836 $cache[$mpid][$mkey] = array();837 838 // Add a value to the current pid/key:839 $cache[$mpid][$mkey][] = $mval;840 }841 }842 843 foreach ( $ids as $id ) {844 if ( ! isset($cache[$id]) )845 $cache[$id] = array();846 wp_cache_add( $id, $cache[$id], $cache_key );847 }848 849 return $cache;850 }851 852 /**853 * Given a meta query, generates SQL clauses to be appended to a main query.854 *855 * @since 3.2.0856 *857 * @see WP_Meta_Query858 *859 * @param array $meta_query A meta query.860 * @param string $type Type of meta.861 * @param string $primary_table Primary database table name.862 * @param string $primary_id_column Primary ID column name.863 * @param object $context Optional. The main query object864 * @return array Associative array of `JOIN` and `WHERE` SQL.865 */866 function get_meta_sql( $meta_query, $type, $primary_table, $primary_id_column, $context = null ) {867 $meta_query_obj = new WP_Meta_Query( $meta_query );868 return $meta_query_obj->get_sql( $type, $primary_table, $primary_id_column, $context );869 }870 871 2 /** 872 3 * Class for generating SQL clauses that filter a primary query according to metadata keys and values. … … 877 8 * 878 9 * @since 3.2.0 10 * @package WordPress 11 * @subpackage Meta 879 12 */ 880 13 class WP_Meta_Query { … … 1604 737 } 1605 738 } 1606 1607 /**1608 * Retrieve the name of the metadata table for the specified object type.1609 *1610 * @since 2.9.01611 *1612 * @global wpdb $wpdb WordPress database abstraction object.1613 *1614 * @param string $type Type of object to get metadata table for (e.g., comment, post, or user)1615 * @return string|false Metadata table name, or false if no metadata table exists1616 */1617 function _get_meta_table($type) {1618 global $wpdb;1619 1620 $table_name = $type . 'meta';1621 1622 if ( empty($wpdb->$table_name) )1623 return false;1624 1625 return $wpdb->$table_name;1626 }1627 1628 /**1629 * Determine whether a meta key is protected.1630 *1631 * @since 3.1.31632 *1633 * @param string $meta_key Meta key1634 * @param string|null $meta_type1635 * @return bool True if the key is protected, false otherwise.1636 */1637 function is_protected_meta( $meta_key, $meta_type = null ) {1638 $protected = ( '_' == $meta_key[0] );1639 1640 /**1641 * Filter whether a meta key is protected.1642 *1643 * @since 3.2.01644 *1645 * @param bool $protected Whether the key is protected. Default false.1646 * @param string $meta_key Meta key.1647 * @param string $meta_type Meta type.1648 */1649 return apply_filters( 'is_protected_meta', $protected, $meta_key, $meta_type );1650 }1651 1652 /**1653 * Sanitize meta value.1654 *1655 * @since 3.1.31656 *1657 * @param string $meta_key Meta key1658 * @param mixed $meta_value Meta value to sanitize1659 * @param string $meta_type Type of meta1660 * @return mixed Sanitized $meta_value1661 */1662 function sanitize_meta( $meta_key, $meta_value, $meta_type ) {1663 1664 /**1665 * Filter the sanitization of a specific meta key of a specific meta type.1666 *1667 * The dynamic portions of the hook name, `$meta_type`, and `$meta_key`,1668 * refer to the metadata object type (comment, post, or user) and the meta1669 * key value,1670 * respectively.1671 *1672 * @since 3.3.01673 *1674 * @param mixed $meta_value Meta value to sanitize.1675 * @param string $meta_key Meta key.1676 * @param string $meta_type Meta type.1677 */1678 return apply_filters( "sanitize_{$meta_type}_meta_{$meta_key}", $meta_value, $meta_key, $meta_type );1679 }1680 1681 /**1682 * Register meta key1683 *1684 * @since 3.3.01685 *1686 * @param string $meta_type Type of meta1687 * @param string $meta_key Meta key1688 * @param string|array $sanitize_callback A function or method to call when sanitizing the value of $meta_key.1689 * @param string|array $auth_callback Optional. A function or method to call when performing edit_post_meta, add_post_meta, and delete_post_meta capability checks.1690 */1691 function register_meta( $meta_type, $meta_key, $sanitize_callback, $auth_callback = null ) {1692 if ( is_callable( $sanitize_callback ) )1693 add_filter( "sanitize_{$meta_type}_meta_{$meta_key}", $sanitize_callback, 10, 3 );1694 1695 if ( empty( $auth_callback ) ) {1696 if ( is_protected_meta( $meta_key, $meta_type ) )1697 $auth_callback = '__return_false';1698 else1699 $auth_callback = '__return_true';1700 }1701 1702 if ( is_callable( $auth_callback ) )1703 add_filter( "auth_{$meta_type}_meta_{$meta_key}", $auth_callback, 10, 6 );1704 }
Note: See TracChangeset
for help on using the changeset viewer.