Bir eklentide kullanılan bir işlev nasıl kullanılmaz?


17

Eklentimde kullandığım işlevlerden biri, küresel kapsamı başka bir işlevle (başka bir eklentide kullanılan) çarpışabilecek bir adla kirletiyor. Yani, sanırım itiraz etmeliyim. Ama bunu nasıl yapmalıyım?

function foo() {
    echo 'bar';
}

Bildiğim _deprecate_function()ama benim eklentinin çekirdeğinden işlevini kaldırmak için almalıdır tüm adımları gösteren bir örnek için minnettar olacaktır.

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


Güzel soru, ama belki eklentinizi adlandırma zamanı mı? Kullanımdan kaldırılan işlevinizden yeni ad alanını yine de arayabilirsiniz ...
brianlmerritt

Namespacing, keşfetmek istediğim bir seçenektir, ancak henüz PHP 5.2 için destek bırakıp bırakmayacağımıza karar vermedim.
henrywright

Php sürümü çok düşükse, ancak ad alanı yoksa, kullanımdan kaldırılmış alternatifin yüklenmesi size bir geçiş yolu verebilir. Onaylanmayan mesajınız "barındırma sağlayıcınız PHP 5.3+ blah blah vb. Desteklemiyor" olabilir
brianlmerritt

Yanıtlar:


11

@Welcher'ın cevabına ek olarak:

Çekirdekte, " işlevlerin ölmeye başladığı" bazı iyi " mezarlık " örnekleri vardır .

Bunları, örneğin dokümantasyonla ilgili olarak kılavuz olarak kullanabilirsiniz.

İşte permalink_link()altında böyle bir örnekwp-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();
}

_deprecated_functionGirdi bağımsız değişkenlerini açıklayan işlevin satır içi belgeleri şunlardır:

/**
 * 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.
 */

1
Bunun için teşekkürler. Çekirdek tarafından alınan yaklaşıma bakmayı düşünmemiştim! Bunların atmam gereken adımlar olduğunu varsayıyorum? 1) tüm orijinal içeriği _deprecated_function()
işlevimden

1
Bu, burada tartışılan iki taraflı bir soruna benziyor - kullanımdan kaldırma ve olası isim çarpışması. Sorunun başlığına göre burada sadece ilk bölümü ele aldım.
birgire

1
@MarkKaplun Devam eden 2 konu olduğunu kabul ediyorum. Soru, işlevin nasıl yok edileceği idi ve cevabım buna dayanıyordu. __Doing_it_wrong bildirimi, temalarında vb. Bu yöntemi çağıran geliştiricilerin, siteyi beyaz ekrandan ziyade API'daki değişikliklere tepki vermelerini sağlamak içindir. Log Deprecated Notices, temel değişiklikleri takip etmenizi sağlayan ve bu durumda da yardımcı olacak harika bir geliştirici eklentisidir.
Welcher

1
@MarkKaplun Ne demek istediğini anlıyorum. Ancak, kullanımdan kaldırmanın bir kısmının, öğe API'dan kaldırılıncaya kadar geriye dönük uyumluluğu sağlamak olduğunu iddia ediyorum. Bildirimin amacı (oluşturmak için hangi yöntem kullanılırsa kullanılsın) geliştiricileri, kaldırılacak yöntemi kullanarak bilgilendirmek ve onlara uygun davranmaları için zaman tanımaktır. Bir şeyden vazgeçmenin yolu, onu vurgulamak ve silmek, doğru yol kullanıcılara önce bir kafa vermek :)
Welcher

2
@MarkKaplun Neye karşı tartıştığınızdan emin değilim (ya da?). Soru, bir yöntemin nasıl kullanımdan kaldırılacağıydı ve OP'nin "eklentim" ifadesinin, kullanımdan çıkarmanın onun geliştirici olduğu anlamına geldiğini bildiği gerçeğiyle açıktır. Bahsettiğiniz sanal kullanıcının bu özel soruyla hiçbir ilgisi yoktur. Günlükte bir milyon bildirim almaktan endişe ediyorsanız, söz konusu yöntemler yalnızca WP_DEBUG etkinse ve sizin açınızdan, bu geliştiriciler tarafından etkinleştirilmezse ve kesinlikle üretimde olmazsa çıkar. Saygıyla bir hamleye katılmamaya saygılı
olacağım

7

Kullanımdan kaldırılma her zaman kaldırılmaya eşit değildir, bu genellikle öğenin API'dan ETKİNLİKLE kaldırılmak üzere işaretlendiği anlamına gelir. Bu, diğer eklentiler veya geliştiriciler tarafından olduğu gibi harici olarak çağrılacak bir yöntem mi? Bu yöntem yalnızca eklenti tarafından dahili olarak kullanılıyorsa, muhtemelen daha iyi bir ad işleviyle değiştirmeyi güvenle kaldırabilirsiniz.

Eğer değilse, daha iyi adlandırılmış işlevi oluşturmak ve bir ile kötü adında bir çağrıyı sahip ediyorum __doing_it_wrongçağrısı - okumuştum kodeksine Bu yönteme kendi başvuruları güncelleştirmek için diğer geliştiricilerin zamanı verecektir ve güvenle yöntemini kaldırabilirsiniz sonraki bir sürüm.

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();
}

Bu yardımcı olur umarım!


Bunun için teşekkürler ama çekirdeğin bunu nasıl yaptığını kopyalamam gerektiğini düşünüyorum. Bir örnek için @birgire tarafından verilen cevaba bir göz atın
henrywright

Bana iyi geliyor :)
Welcher

1

Yeni bir eklenti oluşturursunuz ve kullanıcılarınıza mevcut olan EOL olduğu gibi geçiş yapmasını önerirsiniz.

Eklenti ve tema yazarlarının herkese açık API'larını değiştiren ve bunu "başka bir küçük yükseltme" olarak ele almaya çalışan daha can sıkıcı bir şey yok. Kullanıcılarınızın gerçekten etkilemediği bir sorun nedeniyle siteleri kırmak için hiçbir neden yoktur.


Başka bir eklentinin tam olarak aynı ada sahip bir işlevi varsa (ve ad alanlarını kullanmıyorsa) kullanıcılarım bundan tamamen etkilenecektir.
henrywright

Hayır, eklenti aktivasyonu başarısız olur ve size veya diğer eklentinin yazarına şikayet ederler. Toplam kesinti süresi yaklaşık sıfırdır. Yeni bir eklentiye yükseltme her iki eklentileri gerekiyorsa sitenin işleyişinde hiçbir kesinti ile 15 dakikadan fazla sürmemelidir. İstediğiniz şey, bazı kullanıcılarınızın yükseltme yapması ve bazı işlevlerin herhangi bir bildirim yapılmadan artık çalışmadığını keşfetmesidir. Düzeltme zamanı? onların bir yedeği olduğunu ve bunu düzeltebileceğini düşünüyor musunuz?
Mark Kaplun

Bir API oluşturduktan sonra, sonsuza kadar veya en azından tamamen alakasız olana kadar desteklemelisiniz, örneğin wordpress, 3.4'ten beri kullanımdan kaldırılmış API'ların hiçbirini kaldırmadı ve sadece bir bildirim eklemek size hiçbir faydası olmayacak.
Mark Kaplun

1
+1 çünkü fikrinize saygı duyuyorum ve bu site hakkında hoşlandığım sorunlar, farklı görüş, yaklaşım ve sorunlara çözümlerdir, çünkü genellikle herkese uyan tek bir boyut yoktur.
birgire

1

Şöyle bir şey önerebilirim:

/**
 * @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();
}

Bunun, yığın iziyle birlikte günlüklerde bir kullanımdan kaldırma uyarısı gösterme etkisi vardır. Doğal olarak bu, yalnızca WordPress'te günlüğe kaydetme etkinleştirildiyse çalışır.

Üçlü işleç oradadır çünkü E_USER_DEPRECATED sabiti yalnızca PHP 5.3.0'da kullanılmıştır. Eski sürümlerde bunun yerine basit bir kullanıcı uyarısına geri dönebiliriz.

Gönderen hata sabitleri PHP kılavuzu :

E_DEPRECATED Çalışma zamanı bildirimleri. Gelecek sürümlerde çalışmayacak kod hakkında uyarılar almak için bunu etkinleştirin.

_Doing_it_wrong veya __deprecated_function kullanmayı sevmememin nedeni , bu işlevlerin yalnızca WordPress çekirdeğine yönelik olmasıdır. Bu işlevler üzerindeki kod başvurusundan:

Bu işlevin erişimi özel olarak işaretlenmiştir. Bu, eklenti veya tema geliştiricileri tarafından yalnızca diğer temel işlevlerde kullanılmak üzere tasarlanmadığı anlamına gelir. Tamlık için burada listelenmiştir.


1
Bu tamamen geçerli bir nokta +1 - ama Woocommerce gibi eklentilerin her iki işlevi de kullandığını görebiliriz . ne olursa olsun.
birgire
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.