[wp-hackers] Why do some user meta entries use the table prefix in the meta key?

David Anderson david at wordshell.net
Mon May 13 09:04:07 UTC 2013


On 12/05/13 13:00, Andrew Nacin wrote:
> The reason it's like this is to support entries which can have
> different values on different sites in a Multisite network. For
> example, in Multisite a user can have different privileges on
> different sites within the network. Each site has its own database
> prefix (wp_1_, wp_2_... wp_n_) and the user meta key is based off of
> this.
I don't get this.... as long as all the sites within the network are 
still using the same database and table prefix, then the meta key prefix 
is still an invariant, isn't it? i.e. It only provides something useful 
if the different sites within the network are actually using a different 
table prefix. Otherwise, the same effect could be achieved by just using 
a fixed string instead of the $table_prefix setting. Or am I missing 
something?

Whatever the reason, it occurs to me that this implies a silent 
limitation on use of meta keys - that you must be careful to not use a 
meta key that could match a table prefix, because of errors if/when your 
site is migrated. Alternatively, it could be considered as a limitation 
on migrating - that you shouldn't change your table prefix.

Making this even uglier is the fact that underscore - used in almost 
100% of table prefixes - needs escaping in SQL LIKE statements. If you 
search for all the usermeta entries beginning with the table prefix, 
then naively issuing SQL like this:

SELECT meta_key from ${table_prefix}usermeta WHERE meta_key LIKE 
'${table_prefix}%'

will get you false positives. e.g. if your table prefix is wp_ then that 
SQL actually matches all keys beginning simply with just wp - which 
given that it's WordPress, could be quite a lot.

Very ugly.

David



> -- 
> WordShell - WordPress fast from the CLI - www.wordshell.net


More information about the wp-hackers mailing list