web/wp-includes/meta.php
author ymh <ymh.work@gmail.com>
Mon, 22 Mar 2010 16:36:28 +0100
changeset 5 ac511f1ccc8e
parent 1 0d28b7c10758
permissions -rw-r--r--
add hgignore
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
0d28b7c10758 First commit
ymh
parents:
diff changeset
     1
<?php
0d28b7c10758 First commit
ymh
parents:
diff changeset
     2
/**
0d28b7c10758 First commit
ymh
parents:
diff changeset
     3
 * Meta API
0d28b7c10758 First commit
ymh
parents:
diff changeset
     4
 *
0d28b7c10758 First commit
ymh
parents:
diff changeset
     5
 * Functions for retrieving and manipulating metadata
0d28b7c10758 First commit
ymh
parents:
diff changeset
     6
 *
0d28b7c10758 First commit
ymh
parents:
diff changeset
     7
 * @package WordPress
0d28b7c10758 First commit
ymh
parents:
diff changeset
     8
 * @subpackage Meta
0d28b7c10758 First commit
ymh
parents:
diff changeset
     9
 * @since 2.9.0
0d28b7c10758 First commit
ymh
parents:
diff changeset
    10
 */
0d28b7c10758 First commit
ymh
parents:
diff changeset
    11
0d28b7c10758 First commit
ymh
parents:
diff changeset
    12
function add_metadata($meta_type, $object_id, $meta_key, $meta_value, $unique = false) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    13
	if ( !$meta_type || !$meta_key )
0d28b7c10758 First commit
ymh
parents:
diff changeset
    14
		return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    15
0d28b7c10758 First commit
ymh
parents:
diff changeset
    16
	if ( ! $table = _get_meta_table($meta_type) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
    17
		return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    18
0d28b7c10758 First commit
ymh
parents:
diff changeset
    19
	global $wpdb;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    20
0d28b7c10758 First commit
ymh
parents:
diff changeset
    21
	$column = esc_sql($meta_type . '_id');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    22
0d28b7c10758 First commit
ymh
parents:
diff changeset
    23
	// expected_slashed ($meta_key)
0d28b7c10758 First commit
ymh
parents:
diff changeset
    24
	$meta_key = stripslashes($meta_key);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    25
0d28b7c10758 First commit
ymh
parents:
diff changeset
    26
	if ( $unique && $wpdb->get_var( $wpdb->prepare(
0d28b7c10758 First commit
ymh
parents:
diff changeset
    27
		"SELECT COUNT(*) FROM $table WHERE meta_key = %s AND $column = %d",
0d28b7c10758 First commit
ymh
parents:
diff changeset
    28
		$meta_key, $object_id ) ) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
    29
		return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    30
0d28b7c10758 First commit
ymh
parents:
diff changeset
    31
	$meta_value = maybe_serialize( stripslashes_deep($meta_value) );
0d28b7c10758 First commit
ymh
parents:
diff changeset
    32
0d28b7c10758 First commit
ymh
parents:
diff changeset
    33
	$wpdb->insert( $table, array(
0d28b7c10758 First commit
ymh
parents:
diff changeset
    34
		$column => $object_id,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    35
		'meta_key' => $meta_key,
0d28b7c10758 First commit
ymh
parents:
diff changeset
    36
		'meta_value' => $meta_value
0d28b7c10758 First commit
ymh
parents:
diff changeset
    37
	) );
0d28b7c10758 First commit
ymh
parents:
diff changeset
    38
0d28b7c10758 First commit
ymh
parents:
diff changeset
    39
	wp_cache_delete($object_id, $meta_type . '_meta');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    40
0d28b7c10758 First commit
ymh
parents:
diff changeset
    41
	do_action( "added_{$meta_type}_meta", $wpdb->insert_id, $object_id, $meta_key, $meta_value );
0d28b7c10758 First commit
ymh
parents:
diff changeset
    42
0d28b7c10758 First commit
ymh
parents:
diff changeset
    43
	return true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    44
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    45
0d28b7c10758 First commit
ymh
parents:
diff changeset
    46
function update_metadata($meta_type, $object_id, $meta_key, $meta_value, $prev_value = '') {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    47
	if ( !$meta_type || !$meta_key )
0d28b7c10758 First commit
ymh
parents:
diff changeset
    48
		return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    49
0d28b7c10758 First commit
ymh
parents:
diff changeset
    50
	if ( ! $table = _get_meta_table($meta_type) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
    51
		return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    52
0d28b7c10758 First commit
ymh
parents:
diff changeset
    53
	global $wpdb;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    54
0d28b7c10758 First commit
ymh
parents:
diff changeset
    55
	$column = esc_sql($meta_type . '_id');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    56
	$id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id';
0d28b7c10758 First commit
ymh
parents:
diff changeset
    57
0d28b7c10758 First commit
ymh
parents:
diff changeset
    58
	// expected_slashed ($meta_key)
0d28b7c10758 First commit
ymh
parents:
diff changeset
    59
	$meta_key = stripslashes($meta_key);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    60
0d28b7c10758 First commit
ymh
parents:
diff changeset
    61
	if ( ! $meta_id = $wpdb->get_var( $wpdb->prepare( "SELECT $id_column FROM $table WHERE meta_key = %s AND $column = %d", $meta_key, $object_id ) ) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
    62
		return add_metadata($meta_type, $object_id, $meta_key, $meta_value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    63
0d28b7c10758 First commit
ymh
parents:
diff changeset
    64
	$meta_value = maybe_serialize( stripslashes_deep($meta_value) );
0d28b7c10758 First commit
ymh
parents:
diff changeset
    65
0d28b7c10758 First commit
ymh
parents:
diff changeset
    66
	$data  = compact( 'meta_value' );
0d28b7c10758 First commit
ymh
parents:
diff changeset
    67
	$where = array( $column => $object_id, 'meta_key' => $meta_key );
0d28b7c10758 First commit
ymh
parents:
diff changeset
    68
0d28b7c10758 First commit
ymh
parents:
diff changeset
    69
	if ( !empty( $prev_value ) ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    70
		$prev_value = maybe_serialize($prev_value);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    71
		$where['meta_value'] = $prev_value;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    72
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    73
0d28b7c10758 First commit
ymh
parents:
diff changeset
    74
	do_action( "update_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $meta_value );
0d28b7c10758 First commit
ymh
parents:
diff changeset
    75
0d28b7c10758 First commit
ymh
parents:
diff changeset
    76
	$wpdb->update( $table, $data, $where );
0d28b7c10758 First commit
ymh
parents:
diff changeset
    77
	wp_cache_delete($object_id, $meta_type . '_meta');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    78
0d28b7c10758 First commit
ymh
parents:
diff changeset
    79
	do_action( "updated_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $meta_value );
0d28b7c10758 First commit
ymh
parents:
diff changeset
    80
0d28b7c10758 First commit
ymh
parents:
diff changeset
    81
	return true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    82
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
    83
0d28b7c10758 First commit
ymh
parents:
diff changeset
    84
function delete_metadata($meta_type, $object_id, $meta_key, $meta_value = '', $delete_all = false) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
    85
	if ( !$meta_type || !$meta_key || (!$delete_all && ! (int)$object_id) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
    86
		return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    87
0d28b7c10758 First commit
ymh
parents:
diff changeset
    88
	if ( ! $table = _get_meta_table($meta_type) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
    89
		return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    90
0d28b7c10758 First commit
ymh
parents:
diff changeset
    91
	global $wpdb;
0d28b7c10758 First commit
ymh
parents:
diff changeset
    92
0d28b7c10758 First commit
ymh
parents:
diff changeset
    93
	$type_column = esc_sql($meta_type . '_id');
0d28b7c10758 First commit
ymh
parents:
diff changeset
    94
	$id_column = 'user' == $meta_type ? 'umeta_id' : 'meta_id';
0d28b7c10758 First commit
ymh
parents:
diff changeset
    95
	// expected_slashed ($meta_key)
0d28b7c10758 First commit
ymh
parents:
diff changeset
    96
	$meta_key = stripslashes($meta_key);
0d28b7c10758 First commit
ymh
parents:
diff changeset
    97
	$meta_value = maybe_serialize( stripslashes_deep($meta_value) );
0d28b7c10758 First commit
ymh
parents:
diff changeset
    98
0d28b7c10758 First commit
ymh
parents:
diff changeset
    99
	$query = $wpdb->prepare( "SELECT $id_column FROM $table WHERE meta_key = %s", $meta_key );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   100
0d28b7c10758 First commit
ymh
parents:
diff changeset
   101
	if ( !$delete_all )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   102
		$query .= $wpdb->prepare(" AND $type_column = %d", $object_id );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   103
0d28b7c10758 First commit
ymh
parents:
diff changeset
   104
	if ( $meta_value )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   105
		$query .= $wpdb->prepare(" AND meta_value = %s", $meta_value );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   106
0d28b7c10758 First commit
ymh
parents:
diff changeset
   107
	$meta_ids = $wpdb->get_col( $query );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   108
	if ( !count( $meta_ids ) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   109
		return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   110
0d28b7c10758 First commit
ymh
parents:
diff changeset
   111
	$query = "DELETE FROM $table WHERE $id_column IN( " . implode( ',', $meta_ids ) . " )";
0d28b7c10758 First commit
ymh
parents:
diff changeset
   112
0d28b7c10758 First commit
ymh
parents:
diff changeset
   113
	$count = $wpdb->query($query);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   114
0d28b7c10758 First commit
ymh
parents:
diff changeset
   115
	if ( !$count )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   116
		return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   117
0d28b7c10758 First commit
ymh
parents:
diff changeset
   118
	wp_cache_delete($object_id, $meta_type . '_meta');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   119
0d28b7c10758 First commit
ymh
parents:
diff changeset
   120
	do_action( "deleted_{$meta_type}_meta", $meta_ids, $object_id, $meta_key, $meta_value );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   121
0d28b7c10758 First commit
ymh
parents:
diff changeset
   122
	return true;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   123
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   124
0d28b7c10758 First commit
ymh
parents:
diff changeset
   125
function get_metadata($meta_type, $object_id, $meta_key = '', $single = false) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   126
	if ( !$meta_type )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   127
		return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   128
0d28b7c10758 First commit
ymh
parents:
diff changeset
   129
	$meta_cache = wp_cache_get($object_id, $meta_type . '_meta');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   130
0d28b7c10758 First commit
ymh
parents:
diff changeset
   131
	if ( !$meta_cache ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   132
		update_meta_cache($meta_type, $object_id);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   133
		$meta_cache = wp_cache_get($object_id, $meta_type . '_meta');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   134
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   135
0d28b7c10758 First commit
ymh
parents:
diff changeset
   136
	if ( ! $meta_key )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   137
		return $meta_cache;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   138
0d28b7c10758 First commit
ymh
parents:
diff changeset
   139
	if ( isset($meta_cache[$meta_key]) ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   140
		if ( $single ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   141
			return maybe_unserialize( $meta_cache[$meta_key][0] );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   142
		} else {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   143
			return array_map('maybe_unserialize', $meta_cache[$meta_key]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   144
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   145
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   146
0d28b7c10758 First commit
ymh
parents:
diff changeset
   147
	if ($single)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   148
		return '';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   149
	else
0d28b7c10758 First commit
ymh
parents:
diff changeset
   150
		return array();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   151
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   152
0d28b7c10758 First commit
ymh
parents:
diff changeset
   153
function update_meta_cache($meta_type, $object_ids) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   154
	if ( empty( $meta_type ) || empty( $object_ids ) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   155
		return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   156
0d28b7c10758 First commit
ymh
parents:
diff changeset
   157
	if ( ! $table = _get_meta_table($meta_type) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   158
		return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   159
0d28b7c10758 First commit
ymh
parents:
diff changeset
   160
	$column = esc_sql($meta_type . '_id');
0d28b7c10758 First commit
ymh
parents:
diff changeset
   161
0d28b7c10758 First commit
ymh
parents:
diff changeset
   162
	global $wpdb;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   163
0d28b7c10758 First commit
ymh
parents:
diff changeset
   164
	if ( !is_array($object_ids) ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   165
		$object_ids = preg_replace('|[^0-9,]|', '', $object_ids);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   166
		$object_ids = explode(',', $object_ids);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   167
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   168
0d28b7c10758 First commit
ymh
parents:
diff changeset
   169
	$object_ids = array_map('intval', $object_ids);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   170
0d28b7c10758 First commit
ymh
parents:
diff changeset
   171
	$cache_key = $meta_type . '_meta';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   172
	$ids = array();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   173
	foreach ( $object_ids as $id ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   174
		if ( false === wp_cache_get($id, $cache_key) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   175
			$ids[] = $id;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   176
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   177
0d28b7c10758 First commit
ymh
parents:
diff changeset
   178
	if ( empty( $ids ) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   179
		return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   180
0d28b7c10758 First commit
ymh
parents:
diff changeset
   181
	// Get meta info
0d28b7c10758 First commit
ymh
parents:
diff changeset
   182
	$id_list = join(',', $ids);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   183
	$cache = array();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   184
	$meta_list = $wpdb->get_results( $wpdb->prepare("SELECT $column, meta_key, meta_value FROM $table WHERE $column IN ($id_list)",
0d28b7c10758 First commit
ymh
parents:
diff changeset
   185
		$meta_type), ARRAY_A );
0d28b7c10758 First commit
ymh
parents:
diff changeset
   186
0d28b7c10758 First commit
ymh
parents:
diff changeset
   187
	if ( !empty($meta_list) ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   188
		foreach ( $meta_list as $metarow) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   189
			$mpid = intval($metarow[$column]);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   190
			$mkey = $metarow['meta_key'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   191
			$mval = $metarow['meta_value'];
0d28b7c10758 First commit
ymh
parents:
diff changeset
   192
0d28b7c10758 First commit
ymh
parents:
diff changeset
   193
			// Force subkeys to be array type:
0d28b7c10758 First commit
ymh
parents:
diff changeset
   194
			if ( !isset($cache[$mpid]) || !is_array($cache[$mpid]) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   195
				$cache[$mpid] = array();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   196
			if ( !isset($cache[$mpid][$mkey]) || !is_array($cache[$mpid][$mkey]) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   197
				$cache[$mpid][$mkey] = array();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   198
0d28b7c10758 First commit
ymh
parents:
diff changeset
   199
			// Add a value to the current pid/key:
0d28b7c10758 First commit
ymh
parents:
diff changeset
   200
			$cache[$mpid][$mkey][] = $mval;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   201
		}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   202
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   203
0d28b7c10758 First commit
ymh
parents:
diff changeset
   204
	foreach ( $ids as $id ) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   205
		if ( ! isset($cache[$id]) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   206
			$cache[$id] = array();
0d28b7c10758 First commit
ymh
parents:
diff changeset
   207
	}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   208
0d28b7c10758 First commit
ymh
parents:
diff changeset
   209
	foreach ( array_keys($cache) as $object)
0d28b7c10758 First commit
ymh
parents:
diff changeset
   210
		wp_cache_set($object, $cache[$object], $cache_key);
0d28b7c10758 First commit
ymh
parents:
diff changeset
   211
0d28b7c10758 First commit
ymh
parents:
diff changeset
   212
	return $cache;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   213
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   214
0d28b7c10758 First commit
ymh
parents:
diff changeset
   215
function _get_meta_table($type) {
0d28b7c10758 First commit
ymh
parents:
diff changeset
   216
	global $wpdb;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   217
0d28b7c10758 First commit
ymh
parents:
diff changeset
   218
	$table_name = $type . 'meta';
0d28b7c10758 First commit
ymh
parents:
diff changeset
   219
0d28b7c10758 First commit
ymh
parents:
diff changeset
   220
	if ( empty($wpdb->$table_name) )
0d28b7c10758 First commit
ymh
parents:
diff changeset
   221
		return false;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   222
0d28b7c10758 First commit
ymh
parents:
diff changeset
   223
	return $wpdb->$table_name;
0d28b7c10758 First commit
ymh
parents:
diff changeset
   224
}
0d28b7c10758 First commit
ymh
parents:
diff changeset
   225
?>