| 1 |
<?php |
| 2 |
|
| 3 |
add_filter( 'map_meta_cap', 'bogo_map_meta_cap', 10, 4 ); |
| 4 |
|
| 5 |
function bogo_map_meta_cap( $caps, $cap, $user_id, $args ) { |
| 6 |
$meta_caps = array( |
| 7 |
'bogo_manage_language_packs' => 'install_languages', |
| 8 |
'bogo_edit_terms_translation' => 'manage_categories', |
| 9 |
'bogo_access_all_locales' => 'manage_options', |
| 10 |
'bogo_access_locale' => 'read', |
| 11 |
); |
| 12 |
|
| 13 |
$meta_caps = apply_filters( 'bogo_map_meta_cap', $meta_caps ); |
| 14 |
|
| 15 |
$caps = array_diff( $caps, array_keys( $meta_caps ) ); |
| 16 |
|
| 17 |
if ( isset( $meta_caps[$cap] ) ) { |
| 18 |
$caps[] = $meta_caps[$cap]; |
| 19 |
} |
| 20 |
|
| 21 |
static $accessible_locales = array(); |
| 22 |
|
| 23 |
if ( |
| 24 |
'bogo_access_all_locales' !== $cap and |
| 25 |
! isset( $accessible_locales[$user_id] ) |
| 26 |
) { |
| 27 |
$accessible_locales[$user_id] = bogo_get_user_accessible_locales( |
| 28 |
$user_id |
| 29 |
); |
| 30 |
} |
| 31 |
|
| 32 |
if ( |
| 33 |
'bogo_access_locale' === $cap and |
| 34 |
! user_can( $user_id, 'bogo_access_all_locales' ) |
| 35 |
) { |
| 36 |
$locale = $args[0]; |
| 37 |
|
| 38 |
if ( ! in_array( $locale, $accessible_locales[$user_id] ) ) { |
| 39 |
$caps[] = 'do_not_allow'; |
| 40 |
} |
| 41 |
} |
| 42 |
|
| 43 |
if ( |
| 44 |
in_array( $cap, array( 'edit_post', 'delete_post' ), true ) and |
| 45 |
$post = get_post( $args[0] ) and |
| 46 |
$user_id !== $post->post_author and |
| 47 |
! user_can( $user_id, 'bogo_access_all_locales' ) |
| 48 |
) { |
| 49 |
$locale = bogo_get_post_locale( $post->ID ); |
| 50 |
|
| 51 |
if ( ! in_array( $locale, $accessible_locales[$user_id] ) ) { |
| 52 |
$caps[] = 'do_not_allow'; |
| 53 |
} |
| 54 |
} |
| 55 |
|
| 56 |
return $caps; |
| 57 |
} |
| 58 |
|