| 1 | <?php |
|---|
| 2 | |
|---|
| 3 | /** |
|---|
| 4 | * Plugin Name: WP User Preferences |
|---|
| 5 | * Plugin URI: https://wordpress.org/plugins/wp-user-preferences/ |
|---|
| 6 | * Description: Prefer user settings over site & network options |
|---|
| 7 | * Author: John James Jacoby |
|---|
| 8 | * Version: 0.1.0 |
|---|
| 9 | * Author URI: https://profiles.wordpress.org/johnjamesjacoby/ |
|---|
| 10 | * License: GPL v2 or later |
|---|
| 11 | */ |
|---|
| 12 | |
|---|
| 13 | // Exit if accessed directly |
|---|
| 14 | defined( 'ABSPATH' ) || exit; |
|---|
| 15 | |
|---|
| 16 | /** |
|---|
| 17 | * Get preference for the currently logged in user. If no user is logged in, |
|---|
| 18 | * a site or network preference will be returned if one is set. |
|---|
| 19 | * |
|---|
| 20 | * @since 0.1.0 |
|---|
| 21 | * |
|---|
| 22 | * @param string $key |
|---|
| 23 | * @return mixed |
|---|
| 24 | */ |
|---|
| 25 | function wp_get_current_user_preference( $key = '' ) { |
|---|
| 26 | return wp_get_user_preference( get_current_user_id(), $key ); |
|---|
| 27 | } |
|---|
| 28 | |
|---|
| 29 | /** |
|---|
| 30 | * Get a user preference |
|---|
| 31 | * |
|---|
| 32 | * @since 0.1.0 |
|---|
| 33 | * |
|---|
| 34 | * @param int $user_id |
|---|
| 35 | * @param string $key |
|---|
| 36 | * |
|---|
| 37 | * @return mixed |
|---|
| 38 | */ |
|---|
| 39 | function wp_get_user_preference( $user_id = 0, $key = '' ) { |
|---|
| 40 | |
|---|
| 41 | // Get user/site/network preference map |
|---|
| 42 | $keys = wp_map_user_preference_key( $key ); |
|---|
| 43 | |
|---|
| 44 | // Check usermeta first |
|---|
| 45 | $retval = get_usermeta( $user_id, $keys['user'] ); |
|---|
| 46 | |
|---|
| 47 | // Nothing, so check site option |
|---|
| 48 | if ( false === $retval ) { |
|---|
| 49 | $retval = get_option( $keys['site'] ); |
|---|
| 50 | |
|---|
| 51 | // Nothing, so check network option if multisite |
|---|
| 52 | if ( false === $retval && is_multisite() ) { |
|---|
| 53 | $retval = get_site_option( $keys['network'] ); |
|---|
| 54 | } |
|---|
| 55 | } |
|---|
| 56 | |
|---|
| 57 | // Filter & return |
|---|
| 58 | return apply_filters( 'wp_get_user_preference', $retval, $user_id, $key ); |
|---|
| 59 | } |
|---|
| 60 | |
|---|
| 61 | /** |
|---|
| 62 | * Return an array of key/value pairs for user/site/network settings, based on |
|---|
| 63 | * the usermeta key being passed in. |
|---|
| 64 | * |
|---|
| 65 | * This function exists because not all user, site, & network metadata keys are |
|---|
| 66 | * the same, even though they return the same type of data back. By passing in |
|---|
| 67 | * the usermeta key, we can make decisions about what site & network keys map to |
|---|
| 68 | * a user preference, and fallback to them if no user preference is set yet. |
|---|
| 69 | * |
|---|
| 70 | * @since 0.1.0 |
|---|
| 71 | * |
|---|
| 72 | * @param string $key |
|---|
| 73 | * |
|---|
| 74 | * @return array |
|---|
| 75 | */ |
|---|
| 76 | function wp_map_user_preference_key( $key = '' ) { |
|---|
| 77 | |
|---|
| 78 | // Which usermeta key are we mapping to? |
|---|
| 79 | switch ( $key ) { |
|---|
| 80 | |
|---|
| 81 | // These keys are different between user/site/network |
|---|
| 82 | case 'some_other_preference' : |
|---|
| 83 | $retval = array( |
|---|
| 84 | 'user' => 'one', |
|---|
| 85 | 'site' => 'two', |
|---|
| 86 | 'network' => 'three' |
|---|
| 87 | ); |
|---|
| 88 | break; |
|---|
| 89 | |
|---|
| 90 | // These keys are the same between user/site/network |
|---|
| 91 | case 'admin_color' : |
|---|
| 92 | case 'timezone' : |
|---|
| 93 | case 'time_format' : |
|---|
| 94 | case 'date_format' : |
|---|
| 95 | case 'WPLANG' : |
|---|
| 96 | default : |
|---|
| 97 | |
|---|
| 98 | // Default return value |
|---|
| 99 | $retval = array( |
|---|
| 100 | 'user' => $key, |
|---|
| 101 | 'site' => $key, |
|---|
| 102 | 'network' => $key |
|---|
| 103 | ); |
|---|
| 104 | |
|---|
| 105 | break; |
|---|
| 106 | } |
|---|
| 107 | |
|---|
| 108 | // Filter & return |
|---|
| 109 | return apply_filters( 'wp_map_user_preference_key', $retval, $key ); |
|---|
| 110 | } |
|---|