Wie entferne ich diese Felder aus dem Bereich "Profil"?

16

Ich muss einige Profilfelder gemäß den Benutzerrollen von der Seite "Profil" entfernen. Zum Entfernen des Farbwählers habe ich verwendet remove_action("admin_color_scheme_picker", "admin_color_scheme_picker"). Ich möchte diese Felder entfernen:

  1. Spitzname
  2. Name öffentlich anzeigen als
  3. AIM-, Yahoo-, Google Talk- und About yourself-Felder
  4. Der Bereich "Show Admin Bar" mit den beiden Kontrollkästchen

Ich habe die Datei 'user-edit.php' durchgesehen, um zu sehen, ob es Aktionen / Filter gibt, mit denen ich das machen kann, aber es scheint, als gäbe es keine. Kann mir jemand sagen, wie das geht? Jede Hilfe wäre dankbar. Vielen Dank

EDIT: Danke @helenhousandi für die Antwort. Ich hatte es aber schon so gemacht.

<?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 }
}
?>

Ich weiß, das ist etwas länger, aber es hat funktioniert! Ich denke, ich werde mit @ helenhousandis Antwort gehen.

Rutwick Gangurde
quelle
Wohin soll das gehen? funktionen.php?
Fabian
Ja. Es kann auf functions.phpoder eine Plugin-Datei gehen. Solange die Haken stimmen, funktioniert es an beiden Stellen.
Rutwick Gangurde
OK, aber wenn ich es in die functions.php stecke, wie bringe ich das Javascript zurück? mit return oder echo?
Fabian
Seit WordPress v4.4.1 ist der Spitzname zu einem Pflichtfeld geworden und gibt einen FEHLER aus: Bitte geben Sie einen Spitznamen ein, wenn Sie einen Benutzer mit diesem versteckten, aber nicht
ausgefüllten Namen

Antworten:

15

Für den Kontaktmethodenfilter 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' );
Chris_O
quelle
Danke ... hab das hier! Gibt es etwas für die Bereiche "Show Admin Bar" und "About yourself"?
Rutwick Gangurde
Bitte aktualisieren Sie dies, wenn Sie eine Lösung finden ... Ich akzeptiere Ihre Antwort jedoch. Vielen Dank!
Rutwick Gangurde
+1 weil, soweit ich mich erinnern kann, das Entfernen von Feldern über PHP auch WordPress davon abhält, leere Einträge in der Usermeta-Tabelle zu erstellen.
Ashfame
9

Obwohl der user_contactmethodsFilter einer der wenigen für den Benutzerprofilbildschirm ist, da die anderen Felder in WordPress nicht erforderlich sind, können Sie jQueries verwenden .hide()und .remove()diejenigen, die Sie nicht möchten, ohne Komplikationen beim Speichern der Informationen effektiv entfernen . Sicher, eine Person ohne JS würde sie immer noch sehen, aber das ist eine kleine Minderheit, und ich vermute, dass die Informationen, die sich dort ändern, tatsächlich nichts bewirken werden.

Ein Beispiel für das Entfernen des gesamten Teils der persönlichen Optionen (Verwaltungsleiste und Farbschema anzeigen). Ich weiß, dass es nicht genau das ist, wonach Sie suchen, ich wollte Ihnen nur ein kurzes Beispiel geben, das ich zur Hand habe:

// 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
}

Außerdem ein Hinweis zur Option "Admin-Leiste anzeigen": In 3.3 wird die Admin-Leiste zur Kopfzeile und kann daher nicht aktiviert oder deaktiviert werden.

Ich habe das Codebeispiel aktualisiert, um es genauer und vollständiger zu machen. Hatte ein paar Reste drin.

helenhousandi
quelle
Vielen Dank! Das ist eine schöne Lösung! Was ich getan habe, war etwas Ähnliches, aber ich habe einen anderen Aktions-Hook verwendet, sodass mein Skript nur auf ausgeführt wird profile.php. Ich musste dies auch für eine bestimmte benutzerdefinierte Rolle tun, die in meinem System definiert ist. Aktualisierung meiner Frage mit der Antwort.
Rutwick Gangurde
1
Wenn Sie der jQuery Folgendes hinzufügen, werden auch der Spitzname und der Anzeigename als vor der Frage $("#nickname,#display_name").parent().parent().remove();
verborgen
Sie können auch den Hook edit_user_profile verwenden. Verwenden Sie nicht die Methode jQuery (document) .ready, um den Code sofort auszuführen. So
Giraldi
Nickname wird jetzt benötigt seit WP v.4.4.1
icc97
2

Da es anscheinend keinen guten PHP-Hook dafür gibt, habe ich die Felder mit CSS ausgeblendet und sie dann mit JS entfernt.

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
}
tobbe
quelle
1

Über das WordPress-Support-Forum können Sie die Entfernung mit PHP durchführen. Dies entfernt den Abschnitt über sich selbst:

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');

Der Code ersetzt die Überschrift "About Yourself" durch "Password" und entfernt dann alles zwischen dieser und der nächsten gefundenen Tabelle (die die Kennworttabelle ist).

Auch das Plugin WP Hide Dashboard ersetzt jQuery auf ähnliche Weise, wenn Sie es erweitern möchten.

icc97
quelle
Zum späteren Nachschlagen möchten Sie möglicherweise admin_head-profile.phpand admin_footer-profile.phpverwenden
1

ACHTUNG!!

1) Das Entfernen eines Feldes ist möglicherweise nicht gut , da beim Update, wenn Sie die wesentlichen Felder nicht an den WORDPRESS-Update-Hook senden, möglicherweise leere Werte für diese Felder festgelegt werden! (Zum Beispiel sollte es in übermittelter Form existieren , zB <input name="username".../>)
Ich denke, es ist besser, Benutzer nur visuell auszublenden, mit jquery .hide();und nicht mit .remove();
BEISPIEL-Code, um die Felder " DISPLAY NAME " und " NICKNAME " auszublenden :

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

2) Um die Admin-Leiste auszublenden, gibt es eine spezielle Option im WordPress-Menü (in den Einstellungen) . für benutzerdefinierten Code, wie z

add_action('after_setup_theme', 'remove_admin_bar');

function remove_admin_bar()
{
  if (!current_user_can('administrator') && !is_admin()) 
  {
    show_admin_bar(false);
  }
}
T.Todua
quelle
0

Verwenden

add_action('admin_head', 'remove_profile_fields');

und hinzufügen

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

vor JavaScript.

Akhil Sharma
quelle
Eine kleine Erklärung wäre toll!
Bravokeyl
-4

Es gibt keinen Filter, um sie zu deaktivieren. Schauen Sie sich die Quelle ( /wp-admin/user-edit.php) an, wenn Sie solche Dinge tun müssen. Sie können sie mit JS ausblenden, sie können jedoch weiterhin sichtbar gemacht werden, und die Werte werden beim POST aktualisiert.

Die einzig gangbare Option ist, den Core selbst zu hacken. Stellen Sie einfach sicher, dass Sie mit dem Update fertig sind, und ignorieren Sie diese Felder beim POST.

EarnestoDev
quelle
Ja, ich habe diese Datei bereits überprüft! Die JS-Lösung scheint nicht zu sicher zu sein. Ich sehe was ich tun kann! Vielen Dank!
Rutwick Gangurde
3
Wenn die einzige Lösung, die Sie sich vorstellen können, darin besteht, Core zu hacken, sollten Sie diese bestimmte Frage möglicherweise nicht beantworten. Sie müssen dem Fragesteller auch nicht vorschlagen, die bereits erwähnte Datei anzusehen, und Sie können auch nicht mit Recht behaupten, dass es überhaupt keine Filter gibt - müssen Sie die Frage und die frühere Antwort doch zuerst gelesen haben?
helenhousandi
@helenhousandi xoxo
EarnestoDev