Rimuovere il campo "Sito web" dalle informazioni di contatto
Voglio rimuovere il campo sito web dalle informazioni di contatto utente. Utilizzo il seguente codice per rimuovere AIM, Jabber e Yahoo IM, ma non riesco a usarlo per rimuovere il sito web. Qualcuno può aiutarmi?
function remove_contactmethods( $contactmethods ) {
// Rimuove i metodi di contatto AIM, Yahoo IM e Jabber
unset($contactmethods['aim']);
unset($contactmethods['yim']);
unset($contactmethods['jabber']);
return $contactmethods;
}
// Applica il filtro ai metodi di contatto utente
add_filter('user_contactmethods','remove_contactmethods',10,1);
Risposta rivista e aggiornata:
Non possiamo utilizzare il filtro user_contactmethods
per rimuovere il wrapper del sito web, perché questa parte è hardcoded nel file user-edit.php
e non fa parte del loop filtrato dei contatti utente, generato da:
wp_get_user_contact_methods( $profileuser )
Nasconderlo con CSS
L'elemento riga del sito web ora ha la sua classe .user-url-wrap
:
<tr class="user-url-wrap">
<th><label for="url"><?php _e('Sito web') ?></label></th>
<td>
<input type="url" name="url" id="url"
value="<?php echo esc_attr( $profileuser->user_url ) ?>"
class="regular-text code" />
</td>
</tr>
In precedenza dovevamo usare jQuery per individuare la riga genitore del campo #url
e rimuoverla.
Ma ora possiamo facilmente individuare il wrapper del sito web e nasconderlo con 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' );
Nascondere altri campi
Esistono classi di riga simili:
tr.user-{field}-wrap
disponibili per i campi:
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,
...
inclusi tutti i campi dei metodi dinamici dei contatti utente.
Qui sostituiamo semplicemente la parte {field}
con il nome del campo corrispondente.
Screenshot
Prima di rimuovere la riga del sito web:
Dopo aver rimosso la riga del sito web:

Non funziona per me. Questo codice dovrebbe essere inserito in functions.php giusto??

Devi essere un non-admin quando lo testi oppure commenta la frase if
con il test delle capability. Funziona in functions.php
, ma penso sia meglio averlo in un plugin così non lo perdi quando cambi tema.

Che ne dici di questo apply_filters( "user_{$name}_label", $desc );

Questo modifica solo le etichette, per i metodi di contatto creati dinamicamente, ma non i corrispondenti campi di input testo. Anche il campo sito web non fa parte di questi metodi di contatto dinamici. Sarebbe comunque utile avere tali filtri per tutte le parti user-*-wrap
;-) @BradDalton

Ho risolto il problema con le funzioni ob_ e DOMDocument. È meglio di jQuery o CSS per proteggere il modulo.
Utilizzo questo tipo di soluzione ogni volta che non posso accedere a una parte del contenuto HTML tramite 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();
}

Ampliando la risposta di @birgire e confermando quella di @Patricia Walton, se aggiungi solo
add_action('admin_head-user-edit.php','remove_website_row_wpse_94963');
il campo verrà rimosso solo dalla pagina dove l'amministratore modifica un profilo. Per farlo sparire anche quando un utente modifica il proprio profilo, aggiungi anche
add_action('admin_head-profile.php','remove_website_row_wpse_94963');
, in questo modo:
function remove_website_row_wpse_94963() {
if(!current_user_can('manage_options')){
// nascondi solo per gli utenti non amministratori
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');

Anche per me il codice non funzionava, ma modificando l'add_action per puntare a profile.php ha funzionato.
function remove_website_row_wpse_94963() {
if(!current_user_can('manage_options')){
// nasconde solo per i non amministratori
echo "<script>jQuery(document).ready(function()
{jQuery('#url').parents('tr').remove();});</script>";
}
}
add_action('admin_head-user-edit.php','remove_website_row_wpse_94963');

Espandendo la risposta di @birgire, ho scritto questo in un array per renderlo un po' più leggibile:
function awb_remove_user_profile_fields_with_css() {
//Nasconde i campi indesiderati nel profilo utente
$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'
];
//Aggiunge il CSS
foreach ($fieldsToHide as $fieldToHide) {
echo '<style>tr.user-'.$fieldToHide.'-wrap{ display: none; }</style>';
}
//Campi che non seguono la convenzione di denominazione del wrapper
echo '<style>tr.user-profile-picture{ display: none; }</style>';
//Tutti i sottotitoli
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' );
