WordPress heeft enkele handige plugin gerelateerde plugin directory functies zoals bijvoorbeeld plugin_dir_path()
die uiterst handig bij plugin development.
Toch merk ik dat deze soms foutief of helemaal niet worden gebruikt. In deze blog post ga ik mijn uiterste best doen om aan te tonen hoe je deze kan gebruiken en waarom ze zo handig zijn, alsook vergelijk ik deze met de native PHP directory constanten en functies.
In onderstaande voorbeelden gebruik ik de Block Analyzer plugin waaraan ik volop aan het werken ben. De plugin root folder is web/app/plugins/block-analyzer
en de plugin base name is block-analyzer.php
.
PHP
Laat ons beginnen met de magische constanten van PHP.
In PHP, __FILE__
is een magische constante die het absolute pad van de huidige bestandsnaam retourneert.
# File: /web/app/plugins/block-analyzer/block-analyzer.php
$file = __FILE__;
echo $file // Returns: /web/app/plugins/block-analyzer/block-analyzer.php
PHPNaast __FILE__
heeft PHP ook de __DIR__
constante. Deze geeft het absolute pad naar de map terug van de huidige bestandsnaam zonder de bestandsnaam zelf.
# File: /web/app/plugins/block-analyzer/block-analyzer.php
$dir = __DIR__;
echo $dir // Returns: /web/app/plugins/block-analyzer
PHPNoot: het absolute pad start met een /
en eindigt zonder een /
.
dirname(__FILE__)
de PHP dirname()
functie leunt heel dicht aan bij de __DIR__
constante. Hier ontstaat soms twijfel bij jonge developers waardoor deze verkeerd wordt gebruikt. Daar waar __DIR__ het directory pad van de huidige file retourneert, geeft dirname()
je de mogelijkheid om het directory pad van een absolute bestandsnaam te retourneren. Hiervoor biedt dirname()
je twee handige parameters. De eerste parameter is path
(het pad naar je bestandsnaam), de tweede parameter is het aantal levels
dat je wenst toe te passen.
# File: /web/app/plugins/block-analyzer/block-analyzer.php
$file = '/web/app/plugins/block-analyzer/block-analyzer.php';
echo dirname( $file ) // Returns: /web/app/plugins/block-analyzer
PHPEen voorbeeld met de levels
parameter:
# File: /web/app/plugins/block-analyzer/block-analyzer.php
$file = '/web/app/plugins/block-analyzer/block-analyzer.php';
echo dirname( $file, 1 ) // Returns: /web/app/plugins/block-analyzer
PHPEen kleine instinker. dirname( $file, 1 )
geeft ook /web/app/plugins/block-analyzer
terug en niet /web/app/plugins/
zoals je misschien dacht. Wanneer je één level hoger wil gaan dan de bestandsnaam moet je dirname( $file, 2 )
gebruiken.
De WordPress functies
Dit waren de belangrijkste PHP constanten en functies. Laat ons nu de specifieke WordPress functies onder de loep nemen.
plugin_dir_path()
Laat ons even direct __DIR__
vergelijken met de output van plugin_dir_path()
via onderstaand voorbeeld:
# File: /web/app/plugins/block-analyzer/block-analyzer.php
echo __DIR__ // Returns: /web/app/plugins/block-analyzer
$file = '/web/app/plugins/block-analyzer/block-analyzer.php';
echo plugin_dir_path( $file ) // Returns: /web/app/plugins/block-analyzer/
PHPMerk je het verschil? Inderdaad, plugin_dir_path()
heeft een /
terug op het einde van het pad. Maar waarom voegt WordPress deze extra /
toe? Wel, voor één enkele en duidelijke reden. De /
toont aan dat het om een directory gaat en niet om een bestandsnaam.
plugin_basename()
Deze functie retourneert de primary plugin bestandsnaam. In het voorbeeld dat we gebruiken is dit block-analyzer/block-analyzer.php
.
# File: /web/app/plugins/block-analyzer/block-analyzer.php
$file = '/web/app/plugins/block-analyzer/block-analyzer.php';
echo plugin_basename( $file ) // Returns: block-analyzer/block-analyzer.php
PHPIt all comes together in the end
Soms is het Engels een mooiere taal om je pointe te maken. Laat ons afsluiten met een praktijk voorbeeld waarbij deze WordPress functies samenvloeien m.n. het inladen van je vertaalbestanden (po/mo) voor je plugin.
# File: /web/app/plugins/block-analyzer/block-analyzer.php
function my_plugin_init() {
load_plugin_textdomain( 'my-textdomain', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
}
add_action( 'plugins_loaded', 'my_plugin_init' );
PHPIn het bovenstaand voorbeeld vind je het gebruik van de PHP functie dirname()
in combinatie met de WordPress functie plugin_basename()
. Laat ons dirname( plugin_basename( FILE ) ) . ‘/languages’ ) even verder ontleden:
# File: /web/app/plugins/block-analyzer/block-analyzer.php
$basename = plugin_basename( __FILE__ ) // Returns: block-analyzer/block-analyzer.php
$dirname = dirname( $base_name ) // Returns: block-analyzer
$load_plugin_text_domain = $dirname . '/languages'; // Returns: block-analyzer/languages
PHPMaar je kan in plaats van de dirname()
functie ook de WordPress functie plugin_dir_path()
gebruiken:
# File: /web/app/plugins/block-analyzer/block-analyzer.php
$basename = plugin_basename( __FILE__ ) // Returns: block-analyzer/block-analyzer.php
$dirname = plugin_dir_path( $base_name ) // Returns: block-analyzer
$load_plugin_text_domain = $dirname . 'languages'; // Returns: block-analyzer/languages
PHPWat is het verschil? Inderdaad de /
zoals we voorheen reeds hadden besproken.
I love it when code
comes together.