Hoe zit dat nu met die WordPress plugin directory functies?

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
PHP

Naast __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
PHP

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
PHP

Een 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
PHP

Een 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/
PHP

Merk 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
PHP

It 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' );
PHP

In 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
PHP

Maar 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
PHP

Wat is het verschil? Inderdaad de / zoals we voorheen reeds hadden besproken.

I love it when code comes together.