Τα θεμέλια


Σε αυτό το project θα χρειαστεί να υλοποιήσουμε αρκετές classes, αν θέλουμε να έχουμε τον κώδικα τακτοποιημένο. Για το λόγο αυτό θα φροντίσουμε να βρίσκονται όλες σε ένα δικό μας namespace. Αφού δούμε λίγο την δομή των αρχείων μας, το επόμενο βήμα θα είναι να φτιάξουμε το header του plugin και αμέσως μετά να ορίσουμε τη συνάρτηση που θα φορτώνει αυτόματα τις κλάσεις (class) που θα χρησιμοποιούμε, εκμεταλευόμενοι το μηχανισμό της PHP, για να μπορούμε εύκολα να μοιράσουμε τον κώδικα σε πολλά αρχεία, ένα για κάθε κλάση (class)

Δομή αρχείων

Για αρχή και ξεκινώντας από τον φάκελο του plugin μας, στον αρχικό κατάλογο έχουμε τα αρχεία package.json και package-lock.json, από το npm. Επίσης για λόγος ασφάλειας είναι καλύτερα να συμπεριλάβουμε και ένα αρχείο index.php που να είναι στην ουσία κενό. Θα περιέχει τα παρακάτω:

<?php
// Silence is golden.

Στη συνέχεια δημιουργούμε ένα αρχείο με το ίδιο όνομα με το όνομα του αρχικού μας φακέλου και κατάληξη php (dh-architect-plugin.php), το οποίο είναι το βασικό αρχείο του πρόσθετου (plugin).

Το header

Σε αυτό το αρχείο πάνω πάνω έχουμε την κεφαλίδα (το header)

<?php
/**
 * Plugin Name: Archi Tect
 * Description: Implement 2 CPTs, and blocks to update some of their metadata.
 * Version: 1.0
 * Requires at least:   5.9
 * Requires PHP: 7.1
 * Author:  Kostas Stavrou
 * Author URI:  https://kstavrou.gr
 * License: GPL v2 or later
 * License URI: https://www.gnu.org/licenses/gpl-2.0.html
 * Text Domain: dh-architect-plugin
 * Domain Path: /languages
 */

το οποίο ακολουθείται αμέσως μετά απο τον παρακάτω έλεγχο ότι αυτό το αρχείο PHP φορτώνεται και εκτελείται ως μέρος της διεργασίας του WordPress.

if ( ! defined( 'ABSPATH' ) ) { exit(); }

Ο έλεγχος αυτός θα βρίσκεται κοντά στην αρχή σε όλα τα PHP αρχεία μας για λόγους ασφάλειας.

Class autoloader

Καταχωρούμε μια συνάρτηση που να φορτώνει αυτόματα τις κλάσεις που βρίσκονται στο namespace που ορίζουμε εμείς. Έτσι μπορούμε να κάνουμε εύκολη την χρήση των namespaces. Στο βασικό μας αρχείο αμέσως μετά τον παραπάνω έλεγχο που αναφέραμε (αν εκτελείται ως μέρος της διεργασίας του WordPress) συμπληρώνουμε το παρακάτω για να καλέσουμε ένα εξωτερικό αρχείο που περιέχει την συνάρτηση μας.

include_once "inc" . DIRECTORY_SEPARATOR . "autoload.php";

και ταυτόχρονα στον φάκελο του plugin, δημιουργούμε έναν άλλο φάκελο με όνομα inc και μέσα σε αυτόν δημιουργούμε ένα αρχείο με όνομα autoload.php που περιέχει τα ακόλουθα:

<?php
if ( ! defined( 'ABSPATH' ) ) { exit(); }

function dh_architect_plugin_namespaced_autoloader( $classname ){
    // Define my namespace
    $my_namespace = 'DasodaHae\\Architect\\';
    // Define "src" as the source directory
    $source_code_path = DIRECTORY_SEPARATOR . 'src' . DIRECTORY_SEPARATOR;

    // If it is NOT in my namespace (ie. not my code) just return
    if ( 0 !== strpos( $classname, $my_namespace, 0 )) {
        return;
    }
    $classname = str_replace( $my_namespace, "", $classname );

    $filename = dirname( __DIR__ ) . $source_code_path;
    $filename .= $classname . ".php";
    $filename = str_replace( '\\', DIRECTORY_SEPARATOR, $filename );

    if ( file_exists( $filename )) {
       include $filename;
    }
}
spl_autoload_register( "dh_architect_plugin_namespaced_autoloader" );

Φορτώνοντας το text domain για το localization του plugin

Το WordPress χωρίς plugins, δεν υποστηρίζει την εμφάνιση ενός ιστότοπου σε πολλές γλώσσες με δυναμική εναλλαγή γλώσσας. Παρόλα αυτά όμως το WordPress υποστηρίζει την εμφάνιση του ιστότοπου σε πολλές διαφορετικές γλώσσες, καθώς από τις ρυθμίσεις του ιστότοπου ελέγχουμε την γλώσσα στην οποία εμφανίζεται το περιεχόμενο του ιστότοπου. Όταν αλλάζουμε γλώσσα, τα μηνύματα εμφανίζονται στη νέα γλώσσα. Αυτό επιτυγχάνεται αν α) έχουμε αναπτύξει τα θέματα και τα plugins με τρόπο που να υποστηρίζουν πολλές γλώσσες (να μπορούμε να αλλάξουμε το μήνυμα με βάση τη ρύθμιση γλώσσας, δηλαδή το internationalization ή i18n), και β) την ύπαρξη των μεταφράσεων των μηνυμάτων στη γλώσσα που μας ενδιαφέρει (το localization ή l10n). Ως απαιτούμενο βήμα είναι να φορτώνει το plugin μας τις μεταφράσεις.

Στα παραπάνω link έχει όλες τις προγραμματιστικές πληροφορίες για την υποστήριξη πολλαπλών γλωσσών από το plugin μας. Στην τεκμηρίωση του WordPress υπάρχουν και οι πληροφορίες για την δημιουργία των αρχείων .pot με τη βοήθεια του εργαλείου WP-CLI με τις ακόλουθες εντολές (αφού έχουμε εγκαταστήσει τα wp-cli).

wp i18n make-pot ./ languages/dh-architect-plugin.pot

Από το αρχείο .pot δημιουργούμε τα αρχείο .po και μετά με την ακόλουθη εντολή τα μετατρέπουμε σε αρχεία .mo που βάζουμε στο φάκελο languages.

msgfmt -o filename.mo filename.po

Στο header του plugin έχουμε ήδη ορίσει το text-domain και το domain path.

Δημιουργούμε μέσα στο φάκελο src ένα αρχείο με όνομα Plugin.php, το οποίο θα περιέχει τα παρακατώ:

<?php
namespace DasodaHae\Architect;

if ( ! defined( 'ABSPATH' ) ) { exit(); }

class Plugin {
    public static function LoadTextDomain() {
        $path = basename( dirname( __DIR__ ) ) . '/languages/';
        load_plugin_textdomain( 'dh-architect-plugin', false, $path );
    }
}

και στη συνέχεια στο βασικό αρχείο του plugin μας (το dh-architect-plugin.php) προσθέτουμε το εξής:

/* Load text domain */
add_action( 'plugins_loaded', ['DasodaHae\Architect\Plugin', 'LoadTextDomain'] );