Menghapus "Situs Web" Bidang dari info kontak

9

Saya ingin menghapus bidang situs web dari info kontak pengguna. Saya menggunakan yang berikut ini untuk menghapus AIM, Jabber dan Yahoo IM. Tetapi saya tidak dapat menggunakan ini untuk menghapus situs web. Seseorang tolong bantu.

function remove_contactmethods( $contactmethods ) {
    unset($contactmethods['aim']);
    unset($contactmethods['yim']);
    unset($contactmethods['jabber']);
    return $contactmethods;
}
add_filter('user_contactmethods','remove_contactmethods',10,1);
MidhuN
sumber

Jawaban:

12

Jawaban yang direvisi dan diperbarui:

Kami tidak dapat menggunakan user_contactmethodsfilter untuk menghapus pembungkus situs web, karena bagian ini di-hardcode dalam user-edit.phpfile dan bukan bagian dari loop kontak pengguna yang dapat difilter , dihasilkan oleh:

wp_get_user_contact_methods( $profileuser )

Menyembunyikannya dengan CSS

The situs elemen berturut-turut sekarang punya itu sendiri .user-url-wrapkelas:

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

Sebelumnya kami harus menggunakan jQuery, untuk menargetkan baris induk #urlbidang, untuk dihapus.

Tapi sekarang kita dapat dengan mudah menargetkan pembungkus situs web dan menyembunyikannya dengan 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' );

Menyembunyikan bidang lainnya

Ada kelas baris serupa:

tr.user-{field}-wrap

tersedia untuk bidang:

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,
...

termasuk semua bidang dari metode kontak pengguna dinamis .

Di sini kita hanya mengganti {field}bagian dengan nama bidang yang sesuai.

Tangkapan layar

Sebelum menghapus baris situs web: Sebelum


Setelah menghapus baris situs web: Setelah

birgire
sumber
4
Anda harus menggunakan .remove()sebagai ganti.hide()
Bainternet
Ini tidak bekerja untuk saya. Kode ini harus diletakkan di finctions.php kan ??
MidhuN
Anda harus menjadi non-admin saat mengujinya atau mengomentari ifkalimat dengan tes kemampuan. Ini berfungsi functions.php, tapi saya pikir lebih baik untuk memilikinya dalam sebuah plugin sehingga Anda tidak kehilangan itu ketika Anda mengubah tema.
birgire
Bagaimana dengan iniapply_filters( "user_{$name}_label", $desc );
Brad Dalton
Ini hanya mengubah label, untuk metode kontak yang dibuat secara dinamis , tetapi bukan bidang teks input yang sesuai. Bidang situs web juga bukan bagian dari metode kontak dinamis ini . Akan sangat berguna, untuk memiliki filter seperti itu untuk seluruh user-*-wrapbagian ;-) @BradDalton
birgire
5

Saya menyelesaikan masalah dengan fungsi ob_ dan DOMDocument. Ini lebih baik daripada jQuery atau CSS untuk melindungi formulir.

Saya menggunakan solusi semacam ini setiap kali ketika saya tidak dapat mengakses bagian dari konten HTML melalui sebuah 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();
}
Jérome Obbiet
sumber
Hei, ini bagus.
Michael Mizner
2

Memperluas jawaban @ birgire dan membenarkan @ Patricia Walton, jika Anda hanya menambahkan

add_action('admin_head-user-edit.php','remove_website_row_wpse_94963');

itu hanya akan hilang dari halaman di mana admin mengedit profil. Untuk juga membuatnya menghilang ketika pengguna mengedit profilnya sendiri tambahkan juga

add_action('admin_head-profile.php','remove_website_row_wpse_94963');, seperti ini:

function remove_website_row_wpse_94963() {
    if(!current_user_can('manage_options')){
        // hide only for non-admins
        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');
afrendeiro
sumber
1
Anda melewatkan add_action ketiga untuk halaman pengguna baru:add_action('admin_head-user-new.php','remove_website_row_wpse_94963');
guidod
1

Kode juga tidak berfungsi untuk saya, tetapi mengubah add_action untuk mengarahkan ke profile.php berhasil.

function remove_website_row_wpse_94963() {
    if(!current_user_can('manage_options')){
        // hide only for non-admins
        echo "<script>jQuery(document).ready(function()    
            {jQuery('#url').parents('tr').remove();});</script>";
    }
}

add_action('admin_head-user-edit.php','remove_website_row_wpse_94963');
Patricia Walton
sumber
Saya tidak dapat melihat kode apa yang Anda kirim berbeda dari @birgire one.
gmazzap
0

Memperluas jawaban @ birgire, saya menulis ini ke dalam array sehingga sedikit lebih mudah dibaca:

function awb_remove_user_profile_fields_with_css() {
//Hide unwanted fields in the user profile
$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'

    ];

    //add the CSS
    foreach ($fieldsToHide as $fieldToHide) {
        echo '<style>tr.user-'.$fieldToHide.'-wrap{ display: none; }</style>';
    }

    //fields that don't follow the wrapper naming convention
    echo '<style>tr.user-profile-picture{ display: none; }</style>';

    //all subheadings
    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' );
Kenny
sumber