如何从“个人资料”部分删除这些字段?


16

我必须根据用户角色从“配置文件”页面中删除一些配置文件字段。为了删除我使用的颜色选择器remove_action("admin_color_scheme_picker", "admin_color_scheme_picker")。我要删除这些字段:

  1. 昵称
  2. 将名称公开显示为
  3. AIM,Yahoo,Google Talk和“关于您自己”字段
  4. “显示管理栏”部分以及2个复选框

我浏览了文件“ user-edit.php”,以查看是否有任何操作/过滤器允许我执行此操作,但似乎没有。谁能告诉我该怎么做?任何帮助,将不胜感激。谢谢

编辑: 感谢@helenhousandi的答案。我已经这样做了。

<?php
add_action('admin_footer-profile.php', 'remove_profile_fields');
function remove_profile_fields()
{
    if(current_user_can('custom_role'))
    { ?>
        <script type="text/javascript">
            jQuery("h3:contains('Personal Options')").next('.form-table').remove();
            jQuery("h3:contains('Personal Options')").remove();
            jQuery("h3:contains('About Yourself')").next('.form-table').remove();
            jQuery("h3:contains('About Yourself')").remove();
        </script>
<?php }
}
?>

我知道这需要更长的时间,但是确实有效!我想我会接受@helenhousandi的回答。


这应该去哪里?functions.php?
Fabian

是。它可以转到functions.php或插件文件。只要挂钩正确,它就可以在任何一个地方工作。
Rutwick Gangurde

好的,但是如果我将其放在functions.php中,如何返回javascript?返回或回声?
Fabian

似乎自WordPress v4.4.1起,昵称已成为必填字段,并显示错误:更新用户时,使用此隐藏但未填充的昵称,因此您不能
再将

Answers:


15

对于联系方式过滤器user_contactmethods

function update_contact_methods( $contactmethods ) {

    unset( $contactmethods['aim'] );
    unset( $contactmethods['jabber'] );
    unset( $contactmethods['yim'] );

    return $contactmethods;

}
add_filter( 'user_contactmethods', 'update_contact_methods' );

谢谢...得到了这个!关于“显示管理栏”和“关于自己”部分的内容?
Rutwick Gangurde 2011年

如果您找到解决方案,请更新此信息……不过我接受您的回答。谢谢!
Rutwick Gangurde

+1,因为据我所记得,通过PHP删除字段也阻止了WordPress在usermeta表中创建空白条目。
Ashfame'4

9

尽管user_contactmethods过滤器是用户个人资料屏幕中为数不多的过滤器之一,但由于WordPress不需要其他字段,因此您可以使用jQuery .hide().remove()有效地删除不需要的过滤器,而不会在保存信息方面造成麻烦。当然,没有JS的人仍然会看到它们,但这只是一小部分,我猜测在那里更改的信息实际上不会影响任何东西。

删除整个个人选项的示例(显示管理栏和配色方案)。我知道这并不是您要查找的确切内容,只是想给您一个快速的例子:

// remove personal options block
if( is_admin() ){
    remove_action( 'admin_color_scheme_picker', 'admin_color_scheme_picker' );
    add_action( 'personal_options', 'prefix_hide_personal_options' );
}

function prefix_hide_personal_options() {
  ?>
    <script type="text/javascript">
        jQuery( document ).ready(function( $ ){
            $( '#your-profile .form-table:first, #your-profile h3:first' ).remove();
        } );
    </script>
  <?php
}

另外,还有关于“显示管理栏”选项的注释:在3.3中,管理栏正成为标题,因此无法打开或关闭,因此可能不必担心。

我更新了代码示例,使其更加准确和完整。那里有一些剩菜。


谢谢!这是一个很好的解决方案!我所做的事情类似,但是我使用了不同的动作挂钩,因此我的脚本仅在上运行profile.php。我还需要对系统中定义的特定自定义角色执行此操作。用答案更新我的问题。
Rutwick Gangurde 2011年

1
如果您将以下内容添加到jQuery,它还将对问题隐藏“昵称”和“显示名称为”:$("#nickname,#display_name").parent().parent().remove();
icc97 2012年

您也可以使用edit_user_profile挂钩。并且不要使用jQuery(document).ready方法立即运行代码。像这样
Giraldi

自WP v.4.4.1
icc97 '16

2

由于似乎没有很好的php钩子,我最终用CSS隐藏了字段,然后用JS删除了它们。

add_action( 'admin_head', 'remove_default_profile_fields' );

function remove_default_profile_fields() {

    global $pagenow;

    if( 'profile.php' != $pagenow) return;

    remove_action( 'admin_color_scheme_picker', 'admin_color_scheme_picker' );

    // <tr> selectors, each containing a field
    $tr = array(
        "tr.user-rich-editing-wrap",
        "tr.user-comment-shortcuts-wrap",
        "tr.user-first-name-wrap",
        "tr.user-last-name-wrap",
        "tr.user-admin-bar-front-wrap",
        "tr.user-profile-picture",
        "tr.user-user-login-wrap",
        "tr.user-display-name-wrap",
        "h2" // Personally I decided to remove all H2 tags too.
    );

    $selectors = implode(", ", $tr);

    // Hide the fields with css, so even if javascript is disabled they wont show up. 
    echo "<style>{$selectors}{display:none;}</style>"; ?>

    <script type="text/javascript">
        jQuery( document ).ready(function( $ ){
           // Remove selected <tr>'s
           $( '<?= $selectors; ?>' ).remove();
           // Remove any empty table that may have been left over
           $(".form-table:not(:has(tr))").remove();
        });
    </script>

  <?php
}

1

wordpress支持论坛中,您可以使用PHP进行删除。这将删除“关于您自己”部分:

if (! function_exists('remove_plain_bio') ){
    function remove_plain_bio($buffer) {
        $titles = array('#<h3>About Yourself</h3>#','#<h3>About the user</h3>#');
        $buffer=preg_replace($titles,'<h3>Password</h3>',$buffer,1);
        $biotable='#<h3>Password</h3>.+?<table.+?/tr>#s';
        $buffer=preg_replace($biotable,'<h3>Password</h3> <table class="form-table">',$buffer,1);
        return $buffer;
    }

    function profile_admin_buffer_start() { ob_start("remove_plain_bio"); }

    function profile_admin_buffer_end() { ob_end_flush(); }
}
add_action('admin_head', 'profile_admin_buffer_start');
add_action('admin_footer', 'profile_admin_buffer_end');

该代码将“关于您自己”标头替换为“密码”,然后剥离该标头与找到的下一个表(密码表)之间的所有内容。

另外,如果您想扩展插件,WP Hide Dashboard插件会执行类似的jQuery替换。


对于未来的参考,您可能希望使用admin_head-profile.phpadmin_footer-profile.php替代

1

小心!!

1)删除字段可能并不好,因为在更新时,如果您不将基本字段发送到WORDPRESS更新挂钩,则可能会为这些字段设置空值!(例如,在提交表单中,应该存在ie <input name="username".../>
我认为,最好仅使用可视方式从用户隐藏HIDE,而使用jquery .hide();而不是使用.remove();
Example代码来隐藏“ DISPLAY NAME ”和“ NICKNAME ”字段:

jQuery(document).ready(function( $ ){
    $("#nickname,#display_name").parent().parent().hide();
});

2)要隐藏管理栏,wordpress菜单(位于“设置”中)有一个特殊选项。用于自定义代码,例如

add_action('after_setup_theme', 'remove_admin_bar');

function remove_admin_bar()
{
  if (!current_user_can('administrator') && !is_admin()) 
  {
    show_admin_bar(false);
  }
}

0

采用

add_action('admin_head', 'remove_profile_fields');

并添加

jQuery(document).ready(function(e) {

在JavaScript之前。


稍微解释一下就好了!
bravokeyl

-4

没有过滤器可以禁用它们。/wp-admin/user-edit.php需要进行此类操作时,请查看源()。您可以使用JS隐藏它们,但仍然可以使它们可见,并且值可以在POST上更新。

唯一可行的选择是自己破解内核。只需确保处理更新,而忽略POST上的这些字段。


是的,我已经检查了该文件!JS解决方案似乎不太安全。我会看看我能做什么!谢谢!
Rutwick Gangurde 2011年

3
如果您能想到的唯一解决方案是破解内核,那么也许您不应该回答该特定问题。您也不需要建议提问者查看已经提到的文件,并且指出根本没有过滤器也很不正确-当然您必须先阅读问题并更早地回答?
helenhousandi 2011年

@helenhousandi xoxo
EarnestoDev 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.