Bagaimana cara menghentikan fungsi yang digunakan dalam plugin?

17

Salah satu fungsi yang saya gunakan dalam plugin saya adalah mencemari lingkup global dengan nama yang dapat bertabrakan dengan fungsi lain (digunakan dalam plugin lain). Jadi, saya kira saya harus mencela itu. Tetapi bagaimana saya harus melakukannya?

function foo() {
    echo 'bar';
}

Saya sadar _deprecate_function() tetapi akan berterima kasih atas contoh yang menunjukkan semua langkah yang harus saya ambil untuk menghapus fungsi dari inti plugin saya.

Ref: https://developer.wordpress.org/reference/functions/_deprecated_function/

Henryrywright
sumber
Pertanyaan yang bagus, tetapi apakah mungkin sekarang saatnya untuk namespace plugin Anda? Anda masih dapat memanggil namespace baru dari fungsi usang Anda ...
brianlmerritt
Namespacing adalah opsi yang ingin saya jelajahi tetapi belum cukup memutuskan apakah saya akan membatalkan dukungan untuk PHP 5.2.
henrywright
Memuat alternatif yang tidak digunakan lagi jika versi php terlalu rendah tetapi penempatan nama sebaliknya mungkin memberi Anda jalur transisi. Pesan Anda yang sudah usang dapat berupa "penyedia hosting Anda tidak mendukung PHP 5.3+ blah blah dll"
brianlmerritt

Jawaban:

11

Selain jawaban oleh @Welcher:

Ada beberapa contoh " kuburan " yang baik di inti, di mana " fungsi mati ".

Anda dapat menggunakannya sebagai pedoman, misalnya tentang dokumentasi.

Berikut adalah salah satu contoh untuk di permalink_link()bawah iniwp-includes/deprecated.php

/**
 * Print the permalink of the current post in the loop.
 *
 * @since 0.71
 * @deprecated 1.2.0 Use the_permalink()
 * @see the_permalink()
 */
function permalink_link() {
        _deprecated_function( __FUNCTION__, '1.2', 'the_permalink()' );
        the_permalink();
}

Inilah dokumentasi sebaris untuk _deprecated_functionfungsi yang menjelaskan argumen input:

/**
 * Mark a function as deprecated and inform when it has been used.
 *
 * There is a hook deprecated_function_run that will be called that can be used
 * to get the backtrace up to what file and function called the deprecated
 * function.
 *
 * The current behavior is to trigger a user error if WP_DEBUG is true.
 *
 * This function is to be used in every function that is deprecated.
 *
 * @since 2.5.0
 * @access private
 *
 * @param string $function    The function that was called.
 * @param string $version     The version of WordPress that deprecated the function.
 * @param string $replacement Optional. The function that should have been called. 
 *                            Default null.
 */
birgire
sumber
1
Terima kasih untuk ini. Saya tidak berpikir untuk melihat pendekatan yang diambil oleh inti! Jadi saya menganggap ini adalah langkah-langkah yang harus saya ambil? 1) hapus semua konten asli dari fungsi saya 2) tambahkan panggilan ke _deprecated_function()3) tambahkan panggilan ke fungsi baru saya yang menggantikan yang lama
henrywright
1
Ini terdengar seperti masalah dua sisi yang dibahas di sini - penghinaan dan kemungkinan tabrakan nama. Saya hanya membahas bagian pertama di sini sesuai dengan judul pertanyaan.
birgire
1
@MarkKaplun Saya setuju bahwa ada 2 masalah yang terjadi. Pertanyaannya adalah bagaimana cara menghentikan fungsi dan itulah yang menjadi dasar jawaban saya. Pemberitahuan __doing_it_wrong adalah untuk para pengembang yang memanggil metode ini dalam tema mereka dll untuk memungkinkan mereka bereaksi terhadap perubahan dalam API daripada hanya menyaring situs secara putih. Log Deprecated Notices adalah plugin dev yang hebat yang memungkinkan Anda untuk mengikuti perkembangan perubahan inti dan juga akan membantu dalam hal ini.
Welcher
1
@ MarkKaplun, saya mengerti maksud Anda. Namun saya berpendapat bahwa bagian dari penghinaan adalah untuk menjaga kompatibilitas ke belakang sampai item dihapus dari API. Inti dari pemberitahuan (tidak peduli metode mana yang digunakan untuk menghasilkannya) adalah untuk memberi tahu pengembang menggunakan metode bahwa itu akan dihapus dan memberi mereka waktu untuk bertindak sesuai. Cara untuk mencela sesuatu adalah dengan menyorot dan menghapusnya, cara yang tepat adalah memberi pengguna informasi terlebih dahulu :)
Welcher
2
@ MarkKaplun Saya tidak yakin apa yang Anda perdebatkan (atau untuk?). Pertanyaannya adalah bagaimana cara menolak suatu metode dan itu jelas oleh fakta bahwa OP mengatakan "plugin saya" tahu apa artinya penghinaan bahwa ia adalah seorang pengembang. Pengguna imajiner yang Anda bicarakan tidak ada hubungannya dengan pertanyaan khusus ini. Jika Anda khawatir mendapatkan sejuta pemberitahuan di log, metode yang dipermasalahkan hanya menghasilkan jika WP_DEBUG diaktifkan dan, menurut Anda, itu tidak akan diaktifkan oleh non-pengembang dan tentu saja tidak dalam produksi. Saya akan dengan hormat setuju untuk tidak menyetujui langkah :)
Welcher
7

Penghentian tidak selalu sama dengan penghapusan, biasanya berarti bahwa item ditandai untuk penghapusan EVENTUAL dari API. Apakah ini metode yang akan dipanggil secara eksternal - seperti oleh plugin atau pengembang lain? Jika metode ini hanya digunakan oleh plugin secara internal, Anda mungkin dapat menghapusnya dengan aman dengan fungsi nama yang lebih baik.

Jika tidak, saya akan membuat fungsi dengan nama yang lebih baik dan memanggil orang yang memanggilnya dengan __doing_it_wrongpanggilan - membacanya di dalam kodeks. Ini akan memberi pengembang lain waktu untuk memperbarui referensi mereka ke metode dan Anda dapat dengan aman menghapus metode di versi selanjutnya.

function badly_named() {

    __doing_it_wrong( 'badly_named', 'This method has been deprecated in favor of better_named_function' );

    /**
     * Call the better named method
     */
     better_named_function();
}

Semoga ini membantu!

Welcher
sumber
Terima kasih untuk ini, tetapi saya berpikir saya harus menyalin bagaimana inti melakukannya. Lihatlah jawabannya oleh @birgire untuk contoh
henrywright
Kedengarannya bagus untuk saya :)
Welcher
1

Anda membuat plugin baru dan menyarankan pengguna Anda untuk bermigrasi karena plugin saat ini adalah EOL.

Tidak ada yang lebih menyebalkan daripada pengaya plugin dan tema mengubah API publik mereka dan mencoba memperlakukannya sebagai "sekadar peningkatan kecil" Tidak ada alasan untuk memecah situs karena masalah yang sebenarnya tidak dipengaruhi oleh pengguna Anda.

Mark Kaplun
sumber
Pengguna saya akan sepenuhnya terpengaruh oleh ini jika plugin lain memiliki fungsi dengan nama yang sama persis (dan tidak menggunakan ruang nama).
henrywright
Tidak, aktivasi plugin akan gagal dan mereka akan mengeluh kepada Anda atau pembuat plugin lainnya. Total waktu gangguan sekitar nol. Jika mereka benar-benar membutuhkan kedua plugin, upgrade ke yang baru harus tidak lebih dari 15 menit tanpa gangguan pada fungsi situs. Apa yang Anda inginkan adalah bahwa beberapa pengguna Anda akan meningkatkan dan menemukan bahwa beberapa fungsi tidak berfungsi lagi tanpa pemberitahuan. Waktu untuk memperbaiki? apakah Anda pikir mereka memiliki cadangan sama sekali dan dapat memperbaikinya?
Mark Kaplun
Setelah Anda membuat API, Anda harus tetap mendukungnya selamanya atau setidaknya sampai benar-benar tidak relevan, wordpress misalnya tidak benar-benar menghapus salah satu API yang sudah usang sejak 3.4, dan hanya menambahkan pemberitahuan tidak akan ada gunanya bagimu.
Mark Kaplun
1
1 karena saya menghargai pendapat Anda dan apa yang saya sukai dari situs ini adalah pandangan, pendekatan, dan solusi yang berbeda untuk masalah, karena biasanya tidak ada satu ukuran yang cocok untuk semua.
birgire
1

Saya akan menyarankan sesuatu seperti:

/**
 * @deprecated Please use good_function_name() instead
 * @since x.y.z Marked deprecated in favor of good_function_name()
 * @see good_function_name()
 */
function bad_function_name() {
    trigger_error(
        'The ' . __FUNCTION__ . ' function is deprecated. ' .
        'Please use good_function_name() instead.',
        defined( 'E_USER_DEPRECATED' ) ? E_USER_DEPRECATED : E_USER_WARNING
    );

    return good_function_name();
}

Ini memiliki efek menunjukkan peringatan penghentian dalam log bersama dengan jejak tumpukan. Biasanya ini hanya akan berfungsi jika pencatatan diaktifkan di WordPress.

Operator ternary ada di sana karena konstanta E_USER_DEPRECATED hanya diperkenalkan dalam PHP 5.3.0. Dalam versi yang lebih lama, kita bisa kembali ke peringatan pengguna sederhana.

Dari manual PHP tentang konstanta kesalahan :

E_DEPRECATED Pemberitahuan waktu berjalan. Aktifkan ini untuk menerima peringatan tentang kode yang tidak akan berfungsi di versi mendatang.

Alasan saya tidak suka menggunakan _doing_it_wrong atau __deprecated_function adalah bahwa fungsi-fungsi ini hanya ditujukan untuk inti WordPress. Dari referensi kode pada fungsi-fungsi tersebut:

Akses fungsi ini ditandai pribadi. Ini berarti tidak dimaksudkan untuk digunakan oleh plugin atau pengembang tema, hanya di fungsi inti lainnya. Itu tercantum di sini untuk kelengkapan.

alexg
sumber
1
Itu adalah poin +1 yang benar-benar valid - namun kita dapat melihat bahwa plugin seperti Woocommerce menggunakan kedua fungsi tersebut . bagaimanapun juga.
birgire