Cum să elimini câmpul "Website" din informațiile de contact
Vreau să elimin câmpul website din informațiile de contact ale utilizatorului. Folosesc următorul cod pentru a elimina câmpurile AIM, Jabber și Yahoo IM. Dar nu reușesc să folosesc același cod pentru a elimina website-ul. Cineva să mă ajute, vă rog.
function remove_contactmethods( $contactmethods ) {
// Elimină câmpurile AIM, Jabber și Yahoo IM
unset($contactmethods['aim']);
unset($contactmethods['yim']);
unset($contactmethods['jabber']);
return $contactmethods;
}
add_filter('user_contactmethods','remove_contactmethods',10,1);
Răspuns revizuit și actualizat:
Nu putem folosi filtrul user_contactmethods
pentru a elimina învelișul site-ului web, deoarece această parte este hardcodată în fișierul user-edit.php
și nu face parte din bucla contacte utilizator care poate fi filtrată, generată de:
wp_get_user_contact_methods( $profileuser )
Ascunderea cu CSS
Elementul rând site web are acum propria sa clasă .user-url-wrap
:
<tr class="user-url-wrap">
<th><label for="url"><?php _e('Website') ?></label></th>
<td>
<input type="url" name="url" id="url"
value="<?php echo esc_attr( $profileuser->user_url ) ?>"
class="regular-text code" />
</td>
</tr>
Anterior trebuia să folosim jQuery pentru a ținti rândul părinte al câmpului #url
și a-l elimina.
Dar acum putem ținti cu ușurință învelișul site-ului web și să-l ascundem cu CSS:
function remove_website_row_wpse_94963_css()
{
echo '<style>tr.user-url-wrap{ display: none; }</style>';
}
add_action( 'admin_head-user-edit.php', 'remove_website_row_wpse_94963_css' );
add_action( 'admin_head-profile.php', 'remove_website_row_wpse_94963_css' );
Ascunderea altor câmpuri
Există clase de rând similare:
tr.user-{field}-wrap
disponibile pentru câmpurile:
admin-color,
comment-shortcuts,
admin-bar-front,
user-login,
role,
super-admin,
first-name,
last-name,
nickname,
display-name,
email,
description,
pass1,
pass2,
sessions,
capabilities,
...
inclusiv toate câmpurile din metodele dinamice de contacte utilizator.
Aici înlocuim doar partea {field}
cu numele câmpului corespunzător.
Capturi de ecran
Înainte de eliminarea rândului site-ului web:
După eliminarea rândului site-ului web:

Nu funcționează pentru mine. Acest cod ar trebui pus în functions.php, nu??

Trebuie să fii non-admin când îl testezi sau să comentezi instrucțiunea if
cu testul de capabilitate. Funcționează în functions.php
, dar cred că e mai bine să-l ai într-un plugin ca să nu-l pierzi când schimbi tema.

Aceasta modifică doar etichetele, pentru metodele de contact create dinamic, dar nu și câmpurile de input text corespunzătoare. Câmpul website nu face parte nici el din aceste metode de contact dinamice. Ar fi util totuși să avem astfel de filtre pentru întregile părți user-*-wrap
;-) @BradDalton

Am rezolvat problema cu funcțiile ob_ și DOMDocument. Este mai bună decât jQuery sau CSS pentru protejarea formularului.
Folosesc acest tip de soluție de fiecare dată când nu pot accesa o parte din conținutul HTML printr-un hook.
function remove_extra_field_profile()
{
$current_file_url = preg_replace( "#\?.*#" , "" , basename( $_SERVER['REQUEST_URI'] ) );
if( $current_file_url == "profile.php" )
{
add_action( 'wp_loaded', function(){ ob_start("profile_callback"); } );
add_action( 'shutdown', function(){ ob_end_flush(); } );
}
}
add_action( 'init', 'remove_extra_field_profile' );
function profile_callback( $html )
{
$profile_dom = new DOMDocument;
$profile_dom->loadHTML( $html );
$all_lines = $profile_dom->getElementsByTagname( 'tr' );
$excludes = array(
'user-rich-editing-wrap',
'user-admin-color-wrap',
'user-comment-shortcuts-wrap',
'show-admin-bar user-admin-bar-front-wrap',
'user-url-wrap',
'user-description-wrap'
);
$deletes = array();
foreach ( $all_lines as $line )
{
$tr_calss = $line->getAttribute("class");
if( in_array( $tr_calss, $excludes ) )
{
$deletes[] = $line;
}
}
$deletes[] = $profile_dom->getElementsByTagname( 'h2' )->item(0);
foreach ($deletes as $delete)
{
$delete->parentNode->removeChild( $delete );
}
return $profile_dom->saveHTML();
}

Extinzând răspunsul lui @birgire și argumentând răspunsul lui @Patricia Walton, dacă adaugi doar
add_action('admin_head-user-edit.php','remove_website_row_wpse_94963');
acesta va dispărea doar din pagina unde administratorul editează un profil. Pentru a-l face să dispară și atunci când un utilizator își editează propriul profil, adaugă și
add_action('admin_head-profile.php','remove_website_row_wpse_94963');
, astfel:
function remove_website_row_wpse_94963() {
if(!current_user_can('manage_options')){
// ascunde doar pentru non-administratori
echo "<script>jQuery(document).ready(function(){jQuery('#url').parents('tr').remove();});</script>";
}
}
add_action('admin_head-user-edit.php','remove_website_row_wpse_94963');
add_action('admin_head-profile.php','remove_website_row_wpse_94963');

Codul nu funcționa nici pentru mine, dar schimbarea add_action să pointeze către profile.php a funcționat.
function remove_website_row_wpse_94963() {
if(!current_user_can('manage_options')){
// ascunde doar pentru non-administratori
echo "<script>jQuery(document).ready(function()
{jQuery('#url').parents('tr').remove();});</script>";
}
}
add_action('admin_head-user-edit.php','remove_website_row_wpse_94963');

Extinzând răspunsul lui @birgire, am scris acest lucru într-un array pentru a fi mai ușor de citit:
function awb_remove_user_profile_fields_with_css() {
// Ascunde câmpurile nedorite în profilul utilizatorului
$fieldsToHide = [
'rich-editing',
'admin-color',
'comment-shortcuts',
'admin-bar-front',
'user-login',
'role',
'super-admin',
//'first-name',
//'last-name',
'nickname',
'display-name',
//'email',
'description',
//'pass1',
//'pass2',
'sessions',
'capabilities',
'syntax-highlighting',
'url'
];
// Adaugă CSS-ul
foreach ($fieldsToHide as $fieldToHide) {
echo '<style>tr.user-'.$fieldToHide.'-wrap{ display: none; }</style>';
}
// Câmpuri care nu urmează convenția de denumire a wrapper-ului
echo '<style>tr.user-profile-picture{ display: none; }</style>';
// Toate subtitlurile
echo '<style>#your-profile h2{ display: none; }</style>';
}
add_action( 'admin_head-user-edit.php', 'awb_remove_user_profile_fields_with_css' );
add_action( 'admin_head-profile.php', 'awb_remove_user_profile_fields_with_css' );
