ユーザーがWordpressでプロファイルの編集オプションを無効にする方法をインターネットで調べていましたが、良い方法が見つかりませんでした。問題は、95%のユーザーが自分のプロフィール(住所、電話など)を編集できるようにしたいのですが、さらに5%のユーザーが自分のプロフィールセクションにアクセスしたくないということです。私にとって最良の解決策は、無効にしたいユーザーを手動で選択することですが、それを管理するための役割またはユーザーのグループを作成することも考えました。
このためのプラグインはありません、そして私が見つけた唯一のものは以下のコードですが、それは機能していません。
add_action('admin_init', 'user_profile_fields_disable');
function user_profile_fields_disable() {
global $pagenow;
// apply only to user profile or user edit pages
if ($pagenow!=='profile.php' && $pagenow!=='user-edit.php') {
return;
}
// do not change anything for the administrator
if (current_user_can('administrator')) {
return;
}
if (current_user_can('custom_role') {
add_action( 'admin_footer', 'user_profile_fields_disable_js' );
}
}
/**
* Disables selected fields in WP Admin user profile (profile.php, user-edit.php)
*/
function user_profile_fields_disable_js() {
?>
<script>
jQuery(document).ready( function($) {
var fields_to_disable = ['email', 'role'];
for(i=0; i<fields_to_disable.length; i++) {
if ( $('#'+ fields_to_disable[i]).length ) {
$('#'+ fields_to_disable[i]).attr("disabled", "disabled");
}
}
});
</script>
<?php
}
「custom_role」を、私がユーザーに割り当てたロールの名前に置き換える必要があります。そのコードは時代遅れなのか、それとも悪いのか?それを解決する方法についての任意のアイデア?
どうもありがとうございました。それは素晴らしい完璧な解決策でした。私はWoocommerceプラグインを使用していることを伝えるのを忘れていましたが、「アカウント」ページにプロファイル編集の問題が残っています。
「編集」リンクを削除するために上記のプラグインに何か追加してもらえますか?ユーザーが自分のプロフィールを読むことはできても、編集することはできません。
これが私が話しているものです(いくつかの分野はスペイン語です):
あなたの仕事をもう一度ありがとう!
ユーザーがプロフィールでアクセスする可能性を完全に削除したい場合は、
最初のポイントは 'personal_options' 、 'edit_user_profile_update' フックを使うことでかなり簡単です。
add_action( 'personal_options', 'rpa_profile_ban_field' );
add_action( 'edit_user_profile_update', 'rpa_profile_ban_field_save' );
function rpa_profile_ban_field( \WP_User $user ) {
$current = wp_get_current_user();
if ( ! is_admin() || $user->ID === $current->ID ) return;
if ( ! user_can( $current, 'edit_users' ) ) return;
$target = new WP_User( $user->ID );
if ( $target->exists() && ! user_can( $target, 'edit_users' ) ) {
$banned = (int) get_user_meta( $user->ID, '_profile_banned', TRUE );
?>
<table class="form-table"><tbody><tr>
<th scope="row">Profile Ban</th><td>
<input<?php checked(1, $banned); ?> name="_profile_banned" value="1" type="checkbox">
Ban user to enter profile?
</td></tr></tbody></table>
<?php
}
}
function rpa_profile_ban_field_save( $userid ) {
$current = wp_get_current_user();
if ( ! is_admin() || $user->ID === $current->ID ) return;
if ( ! user_can( $current, 'edit_users' ) ) return;
$target = new WP_User( $userid );
if ( ! $target->exists() || user_can( $target, 'edit_users' ) ) return;
$ban = filter_input( INPUT_POST, '_profile_banned', FILTER_SANITIZE_NUMBER_INT );
if ( (int) $ban > 0 ) {
update_user_meta( $userid, '_profile_banned', 1 );
} elseif ( get_user_meta( $userid, '_profile_banned', TRUE ) ) {
delete_user_meta( $userid, '_profile_banned' );
}
}
このコードを使用すると、管理者は各ユーザーにアクセスしてプロフィールページへのアクセスを無効にすることができます。これはコードの出力です:
メニューからプロフィールリンクを削除するのは簡単です remove_menu_page
:
add_action( 'admin_menu', 'rpa_profile_menu_remove' );
function rpa_profile_menu_remove(){
$remove = get_user_meta( get_current_user_id(), '_profile_banned', TRUE );
if ( ! current_user_can( 'edit_users' ) && (int) $remove > 0 ) {
remove_menu_page( 'profile.php' );
}
}
管理バーからプロフィールリンクを削除するのはもう少し複雑ですが、完全に削除する右上のユーザーメニューは$wp_admin_bar->remove_menu('my-account')
を使用するのは簡単ですが( WP_Admin_Bar
docs を参照)、それはまた「見苦しい」そしてあなたもログアウトする可能性を取り除きます。だからより良い解決策はprofileへのリンクだけを削除することです:
add_action( 'wp_before_admin_bar_render', 'rpa_profile_adminbar_remove' );
function rpa_profile_adminbar_remove() {
$remove = get_user_meta( get_current_user_id(), '_profile_banned', TRUE );
if ( (int) $remove !== 1 || current_user_can( 'edit_users' ) ) return;
global $wp_admin_bar;
$account = (array) $wp_admin_bar->get_node('my-account');
$info = (array) $wp_admin_bar->get_node('user-info');
$logout = (array) $wp_admin_bar->get_node('logout');
$account['href'] = $info['href'] = '#';
$wp_admin_bar->remove_node('my-account');
$wp_admin_bar->remove_node('user-info');
$wp_admin_bar->remove_node('edit-profile');
$wp_admin_bar->remove_node('logout');
$wp_admin_bar->add_node($account);
$wp_admin_bar->add_node($info);
$wp_admin_bar->add_node($logout);
}
上記のすべてのコードを使用すると、ユーザーにはprofileへのリンクが表示されなくなりますが、http://www.example.com/wp-admin/profile.php
と入力するとprofileページが表示されます。これは簡単に解決できます。
add_action( 'load-profile.php', 'rpa_profile_banned_check' );
add_action( 'load-index.php', 'rpa_profile_banned_msg' );
add_action( 'all_admin_notices', 'rpa_profile_banned_msg' );
function rpa_profile_banned_check() {
$remove = get_user_meta( get_current_user_id(), '_profile_banned', TRUE );
if ( (int) $remove === 1 && ! current_user_can( 'edit_users' ) ) {
wp_redirect( add_query_arg( array( 'pbanned' => 1), admin_url('index.php') ) );
exit();
}
}
function rpa_profile_banned_msg() {
if ( current_user_can( 'edit_users' ) ) return;
static $show = false;
if ( current_filter() === 'load-index.php' ) {
$msg = (int) filter_input( INPUT_GET, 'pbanned', FILTER_SANITIZE_NUMBER_INT);
$banned = (int) get_user_meta( get_current_user_id(), '_profile_banned', TRUE );
$show = ( $msg === $banned && $banned === 1 );
} elseif ( current_filter() === 'all_admin_notices' && $show ) {
echo '<div class="error"><p>Sorry, you are not allowed to edit your profile.</p></div>';
}
}
前のコードは、プロファイルページがロードされたときにユーザーが禁止されているかどうかを確認し、そうである場合は、ユーザーにプロファイルの表示を許可しないことを知らせるメッセージを表示できるようにURLに変数を追加します。
これがメッセージの表示方法です。
Gist こちら で利用可能なプラグインとしてのすべてのコード。
誰かが私をWoocommerce 2.0.XXと同じものにする手助けをしてくれました。まず、G.Mをインストールします。上記のプラグイン。それから、ファイル/plugins/woocommerce/templates/myaccount/my-address.phpを編集して、28行目で追加する必要があります。
$checkProfile = get_user_meta( $customer_id, '_profile_banned', TRUE );
そしてまた、45行目に代入する必要があります。
<a href="<?php echo esc_url( add_query_arg('address', $name, get_permalink(woocommerce_get_page_id( 'edit_address' ) ) ) ); ?>" class="edit"><?php _e( 'Edit', 'woocommerce' ); ?></a>
と:
<?php
if (!empty($checkProfile) && $checkProfile==1) {
echo '';
} else {
echo '<a href="', esc_url( add_query_arg('address', $name, get_permalink(woocommerce_get_page_id( 'edit_address' ) ) ) ), '" class="edit">', _e( 'Edit', 'woocommerce' ), '</a>';
}
?>