✅ WEB ja WordPressi uudised, teemad, pistikprogrammid. Siin jagame näpunäiteid ja parimaid veebisaidi lahendusi.

WordPressi vidinad: ümbertöötamine, 7. osa

18

Viimastes postitustes oleme teinud palju tööd, et viia kood ümbertöötamise punktini, mida selles artiklis käsitletakse.

Täpsemalt oleme käsitlenud järgmist:

Kõik need mängivad rolli selles, mida me täna teeme.

WordPressi vidina katlaplaat: ümbertöötamine, 7. osa

Need, kes on WordPressi vidinate API -ga tuttavad, teavad tõenäoliselt, et see pole viimastel aastatel palju muutunud.

Lisaks koosneb see tegelikult ainult neljast funktsioonist (millest üks on konstruktor):

  1. Konstruktor vastutab vidina mitme atribuudi, kõige sagedamini selle nime ja kirjelduse, määramise eest.
  2. Vidina funktsioon vastutab vidina sisu renderdamise eest.
  3. Vormi funktsioon vastutab vidinaga töötamisel vormi kuvamise eest WordPressi haldusalas.
  4. Värskendusfunktsioon vastutab andmebaasi salvestatud valikute värskendamise eest (või lähtestab ja seejärel salvestab suvandid, mida andmebaasis veel ei pruugi olla).

Tore on see, et see konkreetne lähenemine saavutatakse WP_Widget klassi funktsionaalsuse pärimisega.

Probleem on aga selles, et ühe klassi jaoks on see palju tööd.

Selle asemel peaksime eraldama kõik funktsioonid oma funktsionaalsusaladeks.

Nagu iga programmeerimise puhul, on ka viise, kuidas mõned asjad on selged, kuidas neid saab teha, ja siis on asju, mida saab teha mitmel viisil.

Esitan seda, kuidas ma praegu sellele lähenen. See võib tulevikus muutuda või võib-olla mitte ja teistel võib see olla erinev.

Sellest hoolimata on rakendamine palju rohkem objektorienteeritud ja annab igale klassile oma kohustused.

Esimene küsimus on aga, kuidas jagada nelja funktsiooniga klass, mis pärib ülemklassilt?

Bootstrapi värskendamine

Esiteks peame pistikprogrammi alglaadimisribas kohandama mõnda asja. Nimelt peame tegema järgmist:

  1. luua registri ja teha see projekti kaudu kättesaadavaks,
  2. värskendage pluginaklassi, et see aktsepteeriks registrit ja laadiks tellijad,
  3. vaata alglaadimisriba üle

Siin on ülevaade kõigist kolmest ülaltoodust.

1 Looge register

Kuna oleme seda juba sarjas varem käsitlenud, peaks olema selge, kuidas seda teha.

Esiteks vaadake järgmist koodi :

<?php

// Setup a filter so we can retrieve the registry throughout the plugin.
$registry = new Registry();
add_filter('wpwBoilerplateRegistry', function() use ($registry) {
    return $registry;
});

Järgmisena pange tähele, et me loome registri (räägime hetkeks selle nimeruumist) ja ühendame selle kohandatud filtriga, mis võimaldab meil sellele pistikprogrammis igal ajal juurde pääseda.

2 Värskendage pluginaklassi

Järgmisena peame värskendama pistikprogrammi põhiklassi (mis asub  kataloogis src ), et see viitaks registrile ja laadiks kõik registreeritud abonendid :

<?php

/*
 * This file is part of WordPress Widget Boilerplate
 * (c) Tom McFarlin <tom@tommcfarlin.com>
 *
 * This source file is subject to the GPL license that is bundled
 * with this source code in the file LICENSE.
 */

namespace WordPressWidgetBoilerplate;

use WordPressWidgetBoilerplateUtilitiesRegistry;

/**
 * The base class for this plugin. Maintains a copy of the registry and starts
 * all of the objects that should hook into WordPress.
 */
class Plugin
{
    /**
     * @var Registry a reference to the simple container used to maintain plugin objects
     */
    private $registry;

    /**
     * @param Registry $registry a reference to the simple container used to maintain plugin objects
     */
    public function __construct(Registry $registry)
    {
        $this->registry = $registry;
    }

    /**
     * Iterates through each of the subscribers maintained in the registry and registers them
     * to the proper WordPress hook.
     */
    public function start()
    {
        array_map(function ($subscriber) {
            add_action($subscriber->getHook(), [$subscriber, 'load']);
        }, $this->registry->getRegisteredSubscribers());
    }
}

Pange tähele, et me pole veel ühtegi tellijat loonud. Alustasime seda sarja varem ja nüüd on aeg selle juurde tagasi tulla, kuid teeme seda hiljem.

Peame siiski lisama funktsiooni – isegi kui see on ajutine –, et saaksime lisada klasse, mis ei ole konkreetse sündmuse tellijad:

<?php
/**
 * @return array all of the the objects that aren't subscribers registered with WordPress
 */
public function getRegisteredObjects()
{
    $objects = [];
    foreach ($this->registry as $object) {
        if (!$object instanceof AbstractSubscriber) {
            $objects[] = $object;
        }
    }

    return array_filter($objects);
}

Seda muudetakse hiljem, kuna muudame põhiklassid hiljem tellijateks.

3 Vaadake üle Bootstrap

Enne edasiminekut on minu arvates oluline alglaadimisseade üle vaadata. Kuigi teie päis ja dokumentatsioon võivad erineda, on oluline meeles pidada, et teeme järgmist.

  • alglaadimisriba nimevahe,
  • failile juurdepääsu takistamine,
  • automaatlaaduri helistamine,
  • registri seadistamine,
  • ja pistikprogrammi käivitamine.

See kõlab palju, kuid kood on üsna lühike :

<?php
/**
 * WordPress Widget Boilerplate
 *
 * The WordPress Widget Boilerplate is an organized, maintainable boilerplate for building
 * widgets using WordPress best practices.
 *
 * @package   WordPressWidgetBoilerplate
 * @author    Your Name <email@example.com>
 * @license   GPL-3.0+
 * @link      http://example.com
 * @copyright 2018 - 2019 Your Name or Company Name
 *
 * @wordpress-plugin
 * Plugin Name:       WordPress Widget Boilerplate
 * Plugin URI:        https://github.com/tommcfarlin/wordpress-widget-boilerplate
 * Description:       An object-oriented foundation for building WordPress Widgets.
 * Version:           1.0.0
 * Author:            Tom McFarlin
 * Author URI:        https://tommcfarlin.com
 * Text Domain:       widget-name
 * License:           GPL-3.0+
 * License URI:       http://www.gnu.org/licenses/gpl-3.0.txt
 * Domain Path:       /lang
 */

namespace WordPressWidgetBoilerplate;

use WordPressWidgetBoilerplateUtilitiesRegistry;
use WordPressWidgetBoilerplatePlugin;

// Prevent this file from being called directly.
defined('WPINC') || die;

// Include the autoloader.
require_once __DIR__. '/vendor/autoload.php';

// Setup a filter so we can retrieve the registry throughout the plugin.
$registry = new Registry();
add_filter('wpwBoilerplateRegistry', function() use ($registry) {
    return $registry;
});

// Start the machine.
(new Plugin($registry))->start();

Siinkohal on aga aeg vaadata, mis tunne on jagada alamklass tavalisest vidinate API -st millekski, mis sobib meie kasutatava koodimudeliga.

Lapse klassi jagamine

See osa hõlmab tõenäoliselt mõnda postitust, kuna seal on veel natuke tööd teha, kuid alustame oma vidinaklassi loomisega, mis pärib põhividinate klassist.

Kõigepealt tehke src kataloogis API kataloog ja lisage fail nimega Widget.php. See on koht, kus asuvad vidina põhitõed. Järgmises postituses käsitleme administratiivseid ja avalikke laaditabeleid ning JavaScripti faile.

Siinkohal peaksid faili põhitõed välja nägema järgmised :

<?php

/*
 * This file is part of WordPress Widget Boilerplate
 * (c) Tom McFarlin <tom@tommcfarlin.com>
 *
 * This source file is subject to the GPL license that is bundled
 * with this source code in the file LICENSE.
 */

namespace WordPressWidgetBoilerplateAPI;

use WP_Widget;

class Widget extends WP_Widget
{
    /**
     * @var string unique identifier for your widget
     */
    protected $widgetSlug;

    /**
     * Initializes the plugin by setting its properties and calling the parent class with the description.
     *
     * @param mixed $widgetSlug
     */
    public function __construct($widgetSlug)
    {
        $this->widgetSlug = $widgetSlug;

        // TODO: update description
        parent::__construct(
            $this->getWidgetSlug(),
            __('Widget Name', $this->getWidgetSlug()),
            [
                'classname' => $this->getWidgetSlug().'-class',
                'description' => __('Short description of the widget goes here.', $this->getWidgetSlug()),
            ]
        );
    }

    /**
     * Return the widget slug.
     *
     * @return string slug variable
     */
    public function getWidgetSlug()
    {
        return $this->widgetSlug;
    }

    /**
     * TODO: This is a temporary message to show that the Boilerplate has loaded.
     */
    public function load()
    {
        $html = '<p style="text-align:center; background: #fff; padding: 1em; border: 1px dotted gray; margin: 2em 2em 2em 14em;">';
        $html .= 'The Widget Boilerplate is loaded.';
        $html .= '</p>';
        echo $html;
    }
}

Pange tähele, et selleks on vaja ühte argumenti. Olen kasutanud vidina nimi, kuid võite kasutada mida iganes soovite, kui see tähistab teie vidinat.

Selle eesmärk on näidata, et klass on pistikprogrammi aktiveerimisel õigesti instantseeritud ja laaditud. Kui te seda ei näe, siis on midagi valesti (selle vaatame kohe üle).

Järgmiseks on oluline veenduda, et see klass on registrisse lisatud. Seega lisage alglaadimisriba järgmised koodiread:

<?php

// Add the Widget base class to the Registry.
$registry->add('widget', new Widget('widget-name'));

Ja nüüd, kui aktiveerite pistikprogrammi, peaksite nägema järgmist:

WordPressi vidinad: ümbertöötamine, 7. osa

Kui ei, siis vaadake kindlasti arendusharus olev kood üle ja veenduge, et teil on kõik selles postituses kirjeldatu olemas.

Rakendatavad tellijad

Järgmistes postitustes vaatleme, kuidas saaksime tellijaid saidi avalikul küljel (st kus kuvatakse vidina sisu) juurutada. Sama teeme ka saidi haldusalaga.

Lõpuks pöörame tähelepanu koodile, mis vastutab andmete turvamise ja serialiseerimise eest (loe: meie vidina värskendamine) ning seejärel vaatame, milline näeb välja värskendatud katlaplaadi lõplik versioon.

Selles postituses on aga peamine strateegia, mida me kasutame, alamklassi jagamine, nii et seda saab siiski kasutada teiste klassidega, kasutades liideseid ja baasklasse, mis on koodibaasis juba määratletud.

See veebisait kasutab teie kasutuskogemuse parandamiseks küpsiseid. Eeldame, et olete sellega rahul, kuid saate soovi korral loobuda. Nõustu Loe rohkem