Czego powinienem użyć zamiast WP_CONTENT_DIR i WP_PLUGIN_DIR?

15

Dokumentacja WordPress do określania wtyczek i katalogów treści stwierdza, że:

WordPress korzysta z następujących stałych przy określaniu ścieżki do zawartości i katalogów wtyczek. Nie powinny być one używane bezpośrednio przez wtyczki lub motywy , ale są wymienione tutaj dla kompletności.

Przechodzi do listy WP_CONTENT_DIRi WP_PLUGIN_DIRwśród stałych, których twórcy motywów i wtyczek nie powinni używać, prawdopodobnie z tego powodu:

WordPress pozwala użytkownikom na umieszczenie katalogu wp-content w dowolnym miejscu, więc nigdy nie należy zakładać, że wtyczki będą w treści / wtyczkach wp, że przesyłanie będzie w treści wp / treści, lub że motywy będą w wp- treść / tematy.

Mark Jaquith komentuje tutaj również , że tych stałych nie należy używać:

Nie używaj WP_PLUGIN_URL lub WP_PLUGIN_DIR - wtyczki mogą nie znajdować się w katalogu wtyczek.

Jaki jest zatem akceptowany sposób odwoływania się do pełnej ścieżki do wtyczek, zawartości wp i folderów kompozycji bez użycia tych stałych?

Jako prosty przykład, aby wyświetlić pełną ścieżkę wszystkich zainstalowanych wtyczek, mogę to zrobić:

<?php
$plugins = get_plugins();

foreach ($plugins as $file => $details) {
    echo WP_PLUGIN_DIR . '/' . $file . '<br>';
}

Który tworzy taką listę:

/var/www/wp-content/plugins/akismet/akismet.php
/var/www/wp-content/plugins/debug-bar/debug-bar.php
/var/www/wp-content/plugins/hello.php

(Może chciałbym to zrobić, gdybym pisał wtyczkę, aby umożliwić użytkownikowi selektywne archiwizowanie wtyczek, na przykład w ramach kopii zapasowej witryny).

Jeśli użycie WP_PLUGIN_DIRjest nieprawidłowe, jaka jest sugerowana alternatywa? Nie ma odpowiednika wp_upload_dir()dla wtyczek, motywów i folderu zawartości wp, który mogę znaleźć, co sprawia, że ​​odwołanie się do potencjalnie błąkających się motywów i katalogów głównych wtyczek jest problematyczne.

Nacięcie
źródło
Przeczytaj artykuł w Kodeksie Określanie katalogów wtyczek i zawartości .
Charles Clarkson
2
@CharlesClarkson Odwołuję się do tej strony w pierwszym zdaniu mojego pytania. Mówi, aby nie używać powyższych stałych, ale nie sugeruje alternatywy dla takich rzeczy WP_PLUGIN_DIR, stąd moje pytanie tutaj.
Nick

Odpowiedzi:

17

Plik referencyjny w bieżącej ścieżce lub głęboko zagnieżdżony

Aby odwołać się do bieżącej ścieżki

plugin_dir_path( __FILE__ )."further/nesting/here.css";

który działa we wtyczkach i motywach .

Odwołaj się do URl / URi we wtyczce

Aby wskazać wtyczkę lub plik motywu, użyj

plugins_url( "path/to/file", __FILE__ );

który działa tylko we wtyczkach

Odwołaj się do URl / URi w wp-adminfolderze

Zawsze wskaż je admin_url( 'some/path' );. Jest get_admin_url()też.

Odwołaj się do URl / Uri w wp-includesfolderze

Wskaż je includes_url( 'some/path' );

URl / URi w stosunku do strony głównej witryn

Jest home_url( 'etc' );lub get_home_url()do tego. Podobne jest get_site_url()i site_url(). Więc też jest network_home_url(). I masznetwork_admin_url()

wp-content lub katalog o zmienionej nazwie

Możesz ponownie zdefiniować wp-contentnazwę folderu. Dlatego content_url()tam korzystasz .

Jak uzyskać adres URL folderu wtyczek?

Jeśli użycie WP_PLUGIN_DIR jest nieprawidłowe, jaka jest sugerowana alternatywa?

Po prostu użyj plugins_url()bez żadnych parametrów.

Jeśli używasz go jako wtyczki, działa to również z wtyczkami MU.

EDYCJA # 1 Jeśli interesuje Cię ścieżka do bieżącej wtyczki, użyj plugin_basename();.

EDYCJA 2 Jeśli interesują Cię wszystkie aktywne wtyczki na boku, użyj wp_get_active_network_plugins();.

Jeśli nie korzystasz z wielu witryn, idź z wp_get_active_and_valid_plugins();. Uwzględnia to wiele lokalizacji / sieci. Pamiętaj, że weźmie to pod uwagę, jeśli nie jesteś na wielu stronach, ale masz sunrise.phpdropin.

Równie dobrze możesz je odzyskać get_option( 'active_plugins' );, co nie jest zalecane, ponieważ nie uwzględnia filtrów i sprawdzania poprawności wtyczek, co zdarza się kilkakrotnie.


Dalsza lektura

Ta lista jest długa. Więcej informacji można znaleźć w wynikach wyszukiwania w QueryPosts.com .

Ten artykuł idzie w absolutnej głębokości o wszystkich ścieżkach.

kajzer
źródło
3
Dzięki za to, ale twoja odpowiedź wydaje się dotyczyć adresów URL, a nie bezwzględnych ścieżek do serwera, co mnie interesowało. Na przykład plugins_url()zwraca adres URL do folderu wtyczek, a nie pełną ścieżkę do katalogu na serwerze. Czy istnieją podobne funkcje do obsługi katalogów, o których nie wiem? A może rada, aby nie używać WP_PLUGIN_DIRstałej, jest po prostu niewłaściwa?
Nick
(Jestem szczególnie zainteresowany znalezieniem pełnej ścieżki do zainstalowanych wtyczek innych niż wtyczka zawierająca mój własny kod, na wypadek, gdyby to pomogło wyjaśnić.)
Nick
@Nick Zobacz aktualizację.
kaiser
Artykuł „wnikający w głąb wszystkich wtyczek” nie jest już dostępny. I nadal nie rozumiem, jak uzyskać bezwzględną ścieżkę do katalogu wtyczek bez użycia WP_PLUGIN_DIR.
XedinNieznany
4
  1. Zwraca ścieżkę serwera katalogu bieżącej wtyczki:

    plugin_dir_path(__FILE__)
    
    // example: /home/myserver/public_html/wordpress_install/wp-content/plugins/exampleplugin/

    Patrz: https://codex.wordpress.org/Function_Reference/plugin_dir_path

    Nie należy mylić z:

    plugins_dir_path(__FILE__)

    (Zawiadomienie mnoga „plugin s ” na ten temat.)

  2. Ponieważ nie chcesz zwracać nazwy katalogu wtyczek, musimy to usunąć. Oto funkcja, która zwraca katalog wtyczki i nazwę pliku:

    plugin_basename(__FILE__)
    
    // example: exampleplugin/exampleplugin.php
  3. Ale oczywiście nie chcemy też nazwy pliku wtyczki, więc plugin_basename(__FILE__)najpierw musimy go usunąć . Aby zwrócić nazwę pliku wtyczki:

    basename(__FILE__)
    
    // example: exampleplugin.php
  4. Aby użyć ich do zbudowania ścieżki do katalogu wtyczek , możemy użyć str_replace()funkcji czegoś takiego:

    $myBnm = basename(__FILE__); // value: exampleplugin.php
    $myDir = plugin_basename(__FILE__); // value: exampleplugin/exampleplugin.php
    $myStr = str_replace($myBnm,"",$myDir); // value: exampleplugin/
    $myPth = plugin_dir_path(__FILE__); // value: /home/myserver/public_html/wordpress_install/wp-content/plugins/exampleplugin/
    return str_replace($myStr,"",$myPth); // returns: /home/myserver/public_html/wordpress_install/wp-content/plugins/
  5. I w razie potrzeby ten ostatni wiersz można oczywiście przypisać do zmiennej w celu ponownego użycia.

    Zamiast:

    return str_replace($myStr,"",$myPth); // returns: /home/myserver/public_html/wordpress_install/wp-content/plugins/

    Użyj czegoś takiego:

    $thePlgDir = str_replace($myStr,"",$myPth); // returns: /home/myserver/public_html/wordpress_install/wp-content/plugins/

    A później, w razie potrzeby:

    return $thePlgDir;
Joe Rhoney
źródło