WordPress get plugin directory

Is er een functie die het volledige pad van mijn plug-in in WordPress teruggeeft?

Voorbeeld is

path/wp-contents/plugins/myplugin

Ik heb plugin_dir_path(__FILE__)geprobeerd maar geeft de huidige map terug.


Antwoord 1, autoriteit 100%

Ja volgens de beschrijving van plugin_dir_pathhet geeft je het huidige bestandspad van de plug-in. Maar volgens wat je hier vraagt, kun je zoiets als hieronder doen, helaas op geen enkele directe manier,

$plugin_dir = ABSPATH . 'wp-content/plugins/plugin-folder/';

Antwoord 2, autoriteit 99%

Ik zou willen voorstellen om een interne constante van WordPress te gebruiken om dit geval op te lossen:

$my_plugin = WP_PLUGIN_DIR . '/my-plugin';
if ( is_dir( $my_plugin ) ) {
    // plugin directory found!
}

Alternatief

Het andere geldige alternatief is om het pad van de URL te berekenen, wat complexer/verwarrend is. Ik zou deze code niet gebruiken:

$plugins_url = plugins_url();
$base_url = get_option( 'siteurl' );
$plugins_dir = str_replace( $base_url, ABSPATH, $plugins_url );
// Now $plugins_dir is same as the WP_PLUGIN_DIR constant.
$my_plugin = $plugins_dir . '/my-plugin';

Mijn mening in dit geval is: gebruik de constante WP_PLUGIN_DIR


Antwoord 3, autoriteit 44%

Code voor rootpad van plug-in

$dir = plugin_dir_path( __FILE__ );
// Example: /home/user/var/www/wordpress/wp-content/plugins/my-plugin/

Code voor Plugin Path

echo  WP_PLUGIN_DIR.'/plugin-name';

Antwoord 4, Autoriteit 27%

Kind laat op dit feest, maar voor het geval dat er nog een andere struikelt.

plugin_dir_path(__FILE__)zal altijd het huidige pad retourneren (waar het bestand dat het is gevestigd).
Als u de root wilt, gebruikt u de onderstaande code:

plugin_dir_path( dirname( __FILE__ ) )

U kunt dan een constante definiëren:

define( 'YOUR_PLUGIN_DIR', plugin_dir_path( dirname( __FILE__ ) ) );
require_once YOUR_PLUGIN_DIR . 'includes/admin-page.php'
require_once YOUR_PLUGIN_DIR . 'admin/classes.php'

Antwoord 5, Autoriteit 17%

plugins_dir_path()is een verkeerde naam.
Het zal altijd het pad naar het stroom bestand retourneren.

Link naar de Codex:
https://developer.wordpress.org/reference/functions/plugin_dir_path/#More -informatie

Het is een wikkel voor trailingslashit (Dirname ($ -bestand));.

De “plug-in” deel van de naam is misleidend – het kan voor elk bestand worden gebruikt en zal de map van een plug-in niet retourneren, tenzij u het binnen een bestand in de basisdirectory van de plug-in noemt.

Het is eigenlijk synoniem voor de trailingslashit()functie.

ALShet huidige bestand zich in de map pluginsbevindt, danja, retourneert de functie het pad van het huidige bestand.
Als u deze functie echter aanroept vanuit een bestand in elke andere map, dan staat het huidige bestand nietin de map met plug-ins en zal het dus NIETem>retourneert het pad naar de map met plug-ins. Het geeft welaltijd het pad terug naar het huidige bestand, maar zonder een schuine streep aan het einde.

De meeste antwoorden hier zijn onjuist, of zijn slechts “soms” juist. Die antwoorden werken alleen zoals ze zeggen ALS uw bestand zich al in de map met plug-ins bevindt! In alle andere gevallen geven ze je een misleidend resultaat: het pad naar je huidige bestand.


Het is waarschijnlijker dat uw bestand zich in een *submap *van de map met plug-ins bevindt.

Als dit het geval is, laat deze codex u zien hoe u een URL naar het huidige bestand maakt:
https://codex.wordpress.org/Function_Reference/plugins_url

Als u de functie plugins_url() gebruikt in een bestand dat is genest in een submap van uw plug-inmap, moet u de functie dirname() van PHP gebruiken:

<?php
echo '<img src="' . plugins_url( 'images/wordpress.png', dirname(__FILE__) ) . '" > ';
?>

Je zou dan je bestandsnaam moeten verwijderen om het pad te krijgen.
Of gebruik “

ANTWOORD:

Deze oplossingen zijn onafhankelijk van waar het bestand van uw aanroepende functie zich bevindt. Als uw bestand zich in de map met plug-ins bevindt, of een submap ervan, dan werken de bovenstaande opties. Anders moet u uw toevlucht nemen tot iets in de trant van:

WP_PLUGIN_DIR

WordPress heefteen constante gedefinieerd voor de map Plugins:

Codex: https://codex.wordpress.org/Determining_Plugin_and_Content_Directories

Constanten

WordPress maakt gebruik van de volgende constanten bij het bepalen van het pad naar de inhoud- en plug-indirectory’s. Deze mogen niet rechtstreeks door plug-ins of thema’s worden gebruikt, maar worden hier voor de volledigheid vermeld.

WP_CONTENT_DIR // geen slash, alleen volledige paden
WP_CONTENT_URL // volledige url
WP_PLUGIN_DIR // volledig pad, geen afsluitende slash
WP_PLUGIN_URL // volledige url, geen slash

// Standaard beschikbaar in MS, niet ingesteld bij installatie op één site
// Kan worden gebruikt in installaties op één site (zoals gewoonlijk: op eigen risico)
UPLOADS // (indien ingesteld, uploadmap, relatief aan ABSPATH) (voor bijv.: /wp-content/uploads)


Of, als u kunt garanderen dat de map met plug-ins zich op de normale plaats bevindt voor een WordPress-installatie, i_a’s antwoord hierbovenantwoord hierboven zal werken, ongeacht in welke map uw bestand (waarvan u deze functie wilt aanroepen) zich bevindt.
Zie zijn meer complete post in deze thread, maar om geen “alleen link-antwoord” te hebben, zal ik hier opnemen dat het in wezen neerkomt op het gebruik van het volgende (en er een functie van te maken):

$plugins_root = WP_CONTENT_DIR . '/plugins';   

Of de post van M07, ook in deze thread, hier: https://stackoverflow.com/a/28525164/5411817


Antwoord 6, autoriteit 10%

plugin_dir_path( __FILE__ )geeft u Plug-in PATH van Huidig ​​bestand .

Dit is gemiddeld als u deze functie zo belt in “your_plugin_dir / sub_dir / file.php”
Zal “your_plugin_dir / sub_dir /”

retourneren

Als u de -wortel van uw plugin-directory wilt ontvangen, wijzigt u __FILE__naar __DIR__

plugin_dir_path( __DIR__ )

Antwoord 7, Autoriteit 7%

Zoals opgemerkt in het gedeelte Common Usagevan plug-ins url Functie-referentiepagina, dat is wat voor mij werkte:

Als u de functie Plugins_url () in een bestand gebruikt dat is genest in een subdirectory van uw plugin-directory, moet u PHP’s Dirname () -functie gebruiken:

echo plugins_url('', dirname(__FILE__) );

De uitvoer hiervoor was:

http://domain/app/wp-content/plugins/my-plugin

Het bestand dat de functie heeft genoemd, was mijn functions.phpInside includes, dus het volledige pad naar mijn bestand was:

http://domain/app/wp-content/plugins/my-plugin/includes/functions.php

Antwoord 8, Autoriteit 7%

Helaas lijken het grootste deel van de antwoorden hier een belangrijk ding te vergeten.

Naast de plug-ins, kunnen plug-ins ook in de moss-use plug-ins (mu-plug-ins) map

Daarom moeten we meerdere mappen controleren.
Een voorbeeldfunctie om dit te doen:

function get_plugin_dir_path($pluginFolderName){
    if ( defined( 'WPMU_PLUGIN_DIR' ) && file_exists( trailingslashit( WPMU_PLUGIN_DIR ) . $pluginFolderName ) ) {
        return trailingslashit( WPMU_PLUGIN_DIR ) . $pluginFolderName;
    } elseif ( defined( 'WP_PLUGIN_DIR' ) && file_exists( trailingslashit( WP_PLUGIN_DIR ) . $pluginFolderName ) ) {
        return trailingslashit( WP_PLUGIN_DIR ) . $pluginFolderName;
    }
    return false;
}

Antwoord 9, Autoriteit 7%

U kunt een constante in uw hoofd PHP-bestand definiëren. Het moet in de root van uw plug-in-map staan.
Het bestand moet hier zijn: .../wp-content/plugins/plugin-folder/my-plugin.php

U kunt deze regel in het bestand toevoegen.

define( 'MYPLUGIN__PLUGIN_DIR_PATH', plugins_url( '', __FILE__ ) );

Nadat u uw nieuwe constante overal in uw plug-in kunt gebruiken.

public function Test() 
    {   
            $folder2 = MYPLUGIN__PLUGIN_DIR_PATH . '/folder1/folder2/';
           // $folder2 = .../wp-content/plugins/plugin-folder/folder1/folder2/
    }

Ik hoop dat het iemand zal helpen.


Antwoord 10, Autoriteit 5%

Ik zal voorstellen na de code. Als u toegang hebt tot deze functie vanuit elke submap.

plugins_url( 'images/logo.png' , dirname(__FILE__ ));

Antwoord 11, Autoriteit 5%

Hier is een oplossing, wanneer u niet in de plug-in root bent:

Vanaf nu met 4.7.5heeft WordPress geeneen get_plugins_root()functie zoals er een get_theme_root( is) )functie. Dit komt waarschijnlijk omdat u plug-ins van uw thema nooit zou moeten wijzigen en de hoofdmap van plug-ins nooit verandert.

Het kan echter handig zijn als u plug-ins programmatisch moet beïnvloeden tijdens het ontwikkelen van thema’s.

Gewoon, zoals WP doet voor de thema-root:

$plugin_root = WP_CONTENT_DIR . '/plugins';

Of, als je een functie nodig hebt, waarom doe je het dan niet gewoon op dezelfde manier als WordPress het doet voor de thema-root?

Maak gewoon een kopie van de functie get_theme_root()van wp-includes/theme.phpen plak deze in het bestand functions.php van je thema, hernoem de functie naar get_plugins_root(), vereenvoudig het en verander ‘theme’ in ‘plugins’ in de functie…

get_plugins_root() {
    $plugins_root = WP_CONTENT_DIR . '/plugins';
    /**
     * Filters the absolute path to the plugins directory.
     *
     * @since now
     *
     * @param string $plugins_root Absolute path to plugins directory.
     */
    return apply_filters( 'plugins_root', $plugins_root );
}

Met het pad kunt u nu de mapnaam van de plug-ins toevoegen die u wilt beïnvloeden.

$the_plugin_root = get_plugins_root()."/the-plugin-name/";

Antwoord 12, autoriteit 5%

Mijn oplossing was om in plugin_dir_path DIR

te gebruiken

plugin_dir_path( __DIR__ ) . $path_inside_plugin_folder;

Het bovenstaande zou u het absolute pad naar uw plug-inmap op de server moeten geven, dan kunt u uw variabele laden met elk bestand in uw plug-inmap


Antwoord 13

Zoals vermeld door @tsl143 is de functie plugins_url()wat je wilt, samen met de __FILE__magische constante. Als je het oproept vanuit een bestand in je plug-inmap, zal het naar die map verwijzen.

Voorbeeld:

Voor de directory:

echo plugins_url( '' , __FILE__ ); 
//outputs: http://www.example.com/wp-content/plugins/my-plugin    

Voor een bestand of submap in uw plug-inmap:

echo plugins_url( 'images/logo.png' , __FILE__ ); 
//outputs: http://www.example.com/wp-content/plugins/my-plugin/images/logo.png    

Antwoord 14

Je kunt het verkrijgen door deze methode te gebruiken

plugin_dir_url( __DIR__ )

Antwoord 15

De andere oplossingen werken ofwel niet als ze worden aangeroepen vanuit een submap van uw plug-in of ze vereisen dat u de mapnaam van uw plug-in hard codeert of u moet een globale variabele definiëren.

Mijn oplossing gebruikt een functie die in elke map van uw plug-in kan worden geplaatst zonder dat u iets hard hoeft te coderen.

function get_my_plugin_root_dir()
{
    // WP_PLUGIN_DIR will have something like "/home/michael/public_html/wp-content/plugins"
    // __DIR__ will have something like "/home/michael/public_html/wp-content/plugins/my-plugin-folder/the-dir-being-called-from
    // First, we remove WP's root plugin path from our __DIR__ path.
    $path_to_this_files_dir_without_wp_plugin_dir = str_replace(WP_PLUGIN_DIR, '', __DIR__);
    // Now, we're left with only our plugin's path, which looks like
    // this: "/my-plugin-folder/the-dir-being-called-from"
    // Next, we discard any sub-directories that are included with our
    // plugin's path and keep the first directory in the path, our 
    // plugin's directory name.
    $plugin_directory_name_only = explode(DIRECTORY_SEPARATOR, $path_to_this_files_dir_without_wp_plugin_dir)[1];
    // Now $plugin_directory_name_only has "my-plugin-folder"
    // Lastly, we build the plugin's complete root path using 
    // WP's root plugin directory and our plugin's root dir name.
    return WP_PLUGIN_DIR . DIRECTORY_SEPARATOR . $plugin_directory_name_only;
}

Antwoord 16

Vanaf nu is er geen functie die alleen het volledige pad van de basismap van uw plug-in teruggeeft.

De constante WP_CONTENT_DIRwordt echter door WordPress voor zowat dat gebruikt. Maar hoewel WordPress deze constante gebruikt, waarschuwen ze ons om deze niet rechtstreeks in onze plug-ins of thema’s te gebruiken. Dat komt omdat het problemen kan veroorzaken, zoals wanneer gebruikers de map van hun plug-in wijzigen of hernoemen van de standaardmap.

Het gebruik van de functie plugin_dir_path()zal het pad van de map van het bestand teruggeven van waaruit het wordt aangeroepen. Dus als u deze functie aanroept vanuit een PHP-bestand dat zich in een submap van uw plug-in bevindt, zal het het pad van de map van die submap retourneren en niet de basismap van uw plug-in.

Antwoord

Als tijdelijke oplossing kunnen we nu een constante definiëren in een PHP-bestand dat zich direct in de basismap van de plug-in bevindt en de waarde ervan instellen op het resultaat van het aanroepen van plugin_dir_path( __FILE__ ). Op deze manier kunnen we die constante overal in de plug-in gebruiken om het volledige pad van de basismap van de plug-in te krijgen.

Open dus een PHP-bestand dat zich direct in de basismap van uw plug-in bevindt. Bijvoorbeeld:

../wp-content/plugins/myplugin/myplugin.php

Definieer vervolgens een constante door de waarde ervan in te stellen op het resultaat van het aanroepen van de functie plugin_dir_path(). Bijvoorbeeld:

define( 'MYPLUGIN_PLUGIN_DIR_PATH', plugin_dir_path( __FILE__ ) );

Deze constante bevat nu het pad van de hoofdmap van uw plug-in. Dus, nu, als je die constante echo uit een bestand in een map van je plug-in als volgt:

echo MYPLUGIN_PLUGIN_DIR_PATH;

Het zal zoiets als dit afdrukken:

/home/example.com/public_html/wp-content/plugins/myplugin/

Antwoord 17

Deze oplossing was niet beschikbaar toen het oorspronkelijke antwoord werd geaccepteerd.
Als het huidige bestand twee mappen lager is dan het pad van de plug-in, gebruik dan dit:

$plugin_path = plugin_dir_path(dirname(__FILE__, 2));
$plugin_url = plugin_dir_url(dirname(__FILE__, 2)); 

Let op het nummer als de tweede parameter op dirname(), beschikbaar sinds PHP v7.0.0.

De techniek om een constante te gebruiken werkt hier ook mee, deze keer buiten de root-level plugin.php :

// from pluginname/src/API/Common/Constants.php
define( 'MYPLUGIN_PLUGIN_DIR_PATH', plugin_dir_path(dirname(__FILE__, 3)) );

Let op deze opmerkingop de PHP Manual-site:

Dirname houdt ervan om met de schuine strepen te knoeien.

Dus ik normaliseer het pad om dubbele slashes en slashes die verkeerd zijn voor het huidige besturingssysteem te vermijden:

$normalized = wp_normalize_path( $plugin_path . '/' . $required_file);
if (file_exists($normalized))
  require_once $normalized;
else
  die(__('Required file does not exist') . ": $normalized");

Other episodes