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??
MidhuN
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.
birgire
Che ne dici di questo apply_filters( "user_{$name}_label", $desc );
Brad Dalton
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
birgire
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' );