✅ WEB- ja WordPress -uutiset, -teemat, -laajennukset. Täällä jaamme vinkkejä ja parhaita verkkosivustoratkaisuja.

WordPress-widgetit: Refaktorointi, osa 7

21

Muutamassa viimeisessä viestissä olemme tehneet paljon työtä saattaaksemme koodin uudelleenmuodostukseen, jota käsitellään tässä artikkelissa.

Erityisesti olemme käsitelleet:

Kaikki nämä vaikuttavat siihen, mitä aiomme tehdä tänään.

WordPress Widget Boilerplate: Refactoring, osa 7

Ne, jotka ovat perehtyneet WordPress Widgets -sovellusliittymään, tietävät todennäköisesti, että se ei ole juurikaan muuttunut viime vuosina.

Lisäksi se koostuu oikeastaan ​​vain neljästä funktiosta (joista yksi on rakentaja):

  1. Rakentaja on vastuussa widgetin useiden ominaisuuksien asettamisesta, yleisimmin sen nimestä ja kuvauksesta.
  2. Widget-toiminto vastaa widgetin sisällön renderöimisestä.
  3. Lomaketoiminto vastaa lomakkeen näyttämisestä WordPressin hallinta-alueella, kun työskentelet widgetin kanssa.
  4. Päivitystoiminto on vastuussa tietokantaan tallennettujen valintojen päivittämisestä (tai alustuksen ja niiden valintojen tallentamisesta, joita ei ehkä vielä ole tietokannassa).

Mukava asia on, että tämä erityinen lähestymistapa saavutetaan perimällä WP_Widget- luokan toiminnallisuus.

Ongelmana on kuitenkin se, että yhdellä luokalla on paljon työtä.

Sen sijaan meidän pitäisi erottaa jokainen toiminto omaan toiminta-alueeseensa.

Kuten missä tahansa ohjelmoinnissa, on olemassa tapoja, joilla jotkut asiat ovat selkeitä, kuinka ne voidaan tehdä, ja sitten on joitain asioita, jotka voidaan tehdä useilla tavoilla.

Aion esittää sen, miten suhtaudun siihen tällä hetkellä. Tämä voi muuttua tulevaisuudessa tai ehkä ei, ja muut voivat suhtautua asiaan eri tavalla.

Siitä huolimatta toteutus tulee olemaan paljon oliokeskeisempi ja antaa jokaiselle luokalle omat vastuunsa.

Ensimmäinen kysymys kuitenkin on, kuinka jaetaan luokka, jossa on neljä funktiota ja joka perii yläluokan?

Bootstrapin päivitys

Ensinnäkin, meidän on säädettävä joitain asioita laajennuksen käynnistyspalkissa. Nimittäin meidän on tehtävä seuraava:

  1. luoda rekisterin ja asettaa sen saataville projektin kautta,
  2. päivitä Plugin-luokka niin, että se hyväksyy rekisterin ja lataa tilaajat,
  3. tarkista bootstrap

Tässä on katsaus kaikkiin kolmeen yllä olevaan.

1 Luo rekisteri

Koska olemme käsitelleet tätä jo aiemmin sarjassa, pitäisi olla selvää, kuinka tämä tehdään.

Katso ensin seuraava 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;
});

Huomaa seuraavaksi, että luomme rekisterin (puhumme sen nimiavaruudesta hetkellisesti) ja liitämme sen sitten mukautettuun suodattimeen, jonka avulla voimme käyttää sitä koko laajennuksen aikana milloin tahansa.

2 Päivitä Plugin Class

Seuraavaksi meidän on päivitettävä ydinlaajennusluokka (joka sijaitsee src – hakemistossa) niin, että se viittaa rekisteriin ja lataa kaikki rekisteröidyt tilaajat :

<?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());
    }
}

Huomaa kuitenkin, että emme ole vielä määrittäneet yhtään tilaajaa. Aloitimme tämän aiemmin sarjassa ja nyt on aika palata siihen, mutta teemme sen myöhemmin.

Meidän on kuitenkin lisättävä funktio – vaikka se olisikin väliaikainen – jotta voimme lisätä luokkia, jotka eivät ole eksplisiittisiä tapahtuman tilaajia:

<?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);
}

Tätä muokataan myöhemmin, koska muutamme ydinluokat tilaajiksi myöhemmin.

3 Tarkista Bootstrap

Ennen kuin jatkat, mielestäni on tärkeää tarkistaa bootstrap. Vaikka otsikkosi ja dokumentaatiosi voivat vaihdella, on tärkeää huomata, että teemme seuraavat asiat:

  • bootstrapin nimiväli,
  • estää pääsyn tiedostoon,
  • automaattilataajalle soittaminen,
  • rekisterin perustaminen,
  • ja käynnistää plugin.

Se kuulostaa paljon, mutta koodi on melko lyhyt :

<?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();

Tässä vaiheessa on kuitenkin aika tarkastella, millaista on jakaa aliluokka tavallisesta Widgets API :sta johonkin, joka sopii käytettävään koodimalliin.

Lapsiluokan jakaminen

Tämä osa kattaa todennäköisesti muutaman postauksen, koska työtä on vähän, mutta aloitamme luomalla oman widget-luokkamme, joka perii peruswidget-luokan.

Tee ensin API -hakemisto src – hakemistoon ja lisää tiedosto nimeltä Widget.php. Tässä ovat widgetin perusteet. Käsittelemme hallinnollisia ja julkisia tyylisivuja ja JavaScript-tiedostoja seuraavassa viestissä.

Tässä vaiheessa tiedoston perusasioiden pitäisi näyttää tältä :

<?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;
    }
}

Huomaa, että se vaatii yhden argumentin. Olen käyttänyt widgetin nimi, mutta voit käyttää mitä tahansa, kunhan se edustaa widgettiäsi.

Tämä osoittaa, että luokkaa instantoidaan ja ladataan oikein, kun laajennus aktivoidaan. Jos et näe tätä, jokin on vialla (jotka tarkistamme hetken).

Seuraavaksi on tärkeää varmistaa, että tämä luokka on lisätty rekisteriin. Joten lisää seuraavat koodirivit bootstrapiin:

<?php

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

Ja nyt, kun aktivoit laajennuksen, sinun pitäisi nähdä seuraava:

WordPress-widgetit: Refaktorointi, osa 7

Jos ei, tarkista koodi kehityshaarassa varmistaaksesi, että sinulla on kaikki tässä viestissä kuvattu.

Toteuttavat tilaajat

Tulevissa viesteissä aiomme tarkastella, kuinka voimme ottaa tilaajat käyttöön sivuston julkiselle puolelle (eli missä widgetin sisältö näytetään). Ja teemme samoin sivuston hallintoalueella.

Lopuksi käännämme huomiomme koodiin, joka vastaa tietojen suojaamisesta ja sarjoittamisesta (lue: widgetin päivittämisestä), ja sitten katsomme, miltä päivitetyn kattilalevyn lopullinen versio näyttää.

Tässä viestissä käyttämämme ensisijainen strategia on kuitenkin aliluokan jakaminen, jotta sitä voidaan edelleen käyttää muiden luokkien kanssa käyttämällä rajapintoja ja perusluokkia, jotka on jo määritetty koodikannassa.

Tämä verkkosivusto käyttää evästeitä parantaakseen käyttökokemustasi. Oletamme, että olet kunnossa, mutta voit halutessasi kieltäytyä. Hyväksyä Lisätietoja