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

WordPress-widgetit: Refaktorointi, osa 11

24

Edellisessä postauksessa kävimme läpi monia uudelleenjärjestelyjä, jotka erottivat huolenaiheet omiin luokkiinsa.

Viime kädessä tämä auttaa osoittamaan, kuinka voimme ylläpitää korkeaa koheesion tasoa työskennellessämme WordPressin luokkien lisäksi myös olemassa olevien API:iden kanssa.

Koska viimeiset viestit koodikannan uudelleenmuodostamisesta ovat olleet niin pitkiä, nykyiset viestit keskittyvät pieniin, asteittain tapahtuviin muutoksiin ja siten lyhyempiin, tarkempiin viesteihin.

Kuten edellisessä artikkelissa mainittiin:

Mutta jos päivität sivun, saatat huomata, että desinfiointi ja serialisointi eivät näytä toimivan tietoja haettaessa. Ja sitä aiomme tarkastella seuraavassa postauksessa.

Joten tässä artikkelissa poimimme sen.

WordPress Widget Boilerplate: Refactoring osa 11

Ennen kuin kirjoitat mitään koodia, huomaa ensin, että jos täytät yhden widgetin sisältöalueista (kuten otsikon) jollain tämmöisellä :

<script type="text/javascript">This is the Title</script>

Napsauta sitten Tallenna, todellinen sisältö desinfioidaan ja kirjoitetaan tietokantaan. Voit nähdä tämän olevan totta katsomalla widgetin arvoa tietokannassa.

Lisäksi tiedot näyttävät ensi silmäyksellä hyvältä, mutta jos päivität sivun, puhdistamaton sisältö tulee näkyviin. Jos siirryt toiselle sivulle, kuten valikot, ja palaat sitten takaisin, widgetin sisältö näkyy, mutta se on kunnolla desinfioitu.

Miksi se sitten näyttää yhtä asiaa tietokannassa ja yhtä asiaa hallinta-alueen etuosassa tiettyjä vaiheita suoritettaessa?

Tämä liittyy widget-välimuistiin, ja onneksi voimme tyhjentää tämän välimuistin haluamallamme tavalla käyttämällä mitä tahansa haluamiasi koukkuja (eli voimme tilata minkä tahansa tapahtuman ja pyytää sen sitten tyhjentämään välimuistin).

Koodiviittauksesta: _

Poistaa välimuistin sisältöä vastaavan avaimen ja ryhmän.

Huomaa kuitenkin, että se edellyttää avaimen ja valinnaisen ryhmän toimittamista. Boilerplatessa olemme käyttäneet widgetin etanaa avaimena ja ryhmä on widget.

Välimuistin tyhjentäminen

Koska toiminto voidaan kytkeä mihin tahansa tapahtumaan, voimme luoda tilaajan, jonka voimme liittää mihin tahansa tapahtumaan. Tämä tarkoittaa , että voimme luoda DeleteWidgetCache-tilaajan Tilaajan nimiavaruuteen:

<?php

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

/**
 * Deletes the cached contents of the widget.
 */
class DeleteWidgetCacheSubscriber extends AbstractSubscriber
{
    /**
     * {@inheritdoc}
     */
    public function __construct(string $hook)
    {
        parent::__construct($hook);
    }

    /**
     * Flushes the widget's cache based on the key that's specified in the function arguments.
     */
    public function load()
    {
        /* Because we're implementing an abstract class, we'll parse arguments from the
         * func_get_args().
         */
        $args = func_get_args();
        if (!$this->hasValidArguments($args)) {
            return;
        }

        // TODO: More to come...
    }

    /**
     * Verifies that we have valid arguments with which to work.
     *
     * @param array $args the array of arguments we are validating
     *
     * @return bool true if the arguments are valid; otherwise, false
     */
    private function hasValidArguments(array $args): bool
    {
        // First, check the initial index of the arguments.
        if (!isset($args[0])) {
            return false;
        }

        // Next, check the values of the arguments for the widget key and group.
        $args = $args[0];
        if (!isset($args[0]) && !isset($args[1])) {
            return false;
        }

        return true;
    }
}

Päivitämme sitten bootstrapin lisätäksemme tilaajan rekisteriin ja käytämme mukautettua koukkua, flush_widget_cache, jota käytämme hetkellisesti.

<?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;
use WordPressWidgetBoilerplateSubscriberWidgetSubscriber;
use WordPressWidgetBoilerplateSubscriberDeleteWidgetCacheSubscriber;

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

// Add subscribers.
$registry->add('deleteWidgetCacheSubscriber', new DeleteWidgetCacheSubscriber('flush_widget_cache'));

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

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

Boilerplatea varten käytämme mukautettua tapahtumaa aina, kun widgetin serialisointikoodia kutsutaan.

Ensin määritämme do_action- kutsun, tunnistamme sen flush_widget_cacheksi ja välitämme sitten tapahtumalle tarvittavat argumentit, jotta tilaaja voi lukea ne:

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

/**
 * Santiizes and saves the data for the widget.
 */
class WidgetSerializer
{
    /**
     * @var string a reference to the slug of the widget to which the serialier is associated
     */
    private $widgetSlug;

    /**
     * Initializes the class.
     *
     * @param string a reference to the slug of the widget to which the serialier is associated
     */
    public function __construct(string $widgetSlug)
    {
        $this->widgetSlug = $widgetSlug;
    }

    /**
     * Updates the values of the widget. Sanitizes the information before saving it.
     *
     * @param array $newInstance the array of new options to save
     */
    public function update($newInstance)
    {
        $instance = [];
        foreach ($newInstance as $key => $value) {
            $instance[$key] = strip_tags(
                stripslashes($value)
            );
        }

        do_action('flush_widget_cache', [$this->widgetSlug, 'widget']);

        return $instance;
    }
}

Ja sitten tilaajassa tyhjennämme välimuistin saapuvien argumenttien perusteella:

<?php

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

/**
 * Deletes the cached contents of the widget.
 */
class DeleteWidgetCacheSubscriber extends AbstractSubscriber
{
    /**
     * {@inheritdoc}
     */
    public function __construct(string $hook)
    {
        parent::__construct($hook);
    }

    /**
     * Flushes the widget's cache based on the key that's specified in the function arguments.
     */
    public function load()
    {
        /* Because we're implementing an abstract class, we'll parse arguments from the
         * func_get_args().
         */
        $args = func_get_args();
        if (!$this->hasValidArguments($args)) {
            return;
        }

        $args = $args[0];
        wp_cache_delete($args[0], $args[1]);
    }

    /**
     * Verifies that we have valid arguments with which to work.
     *
     * @param array $args the array of arguments we are validating
     *
     * @return bool true if the arguments are valid; otherwise, false
     */
    private function hasValidArguments(array $args): bool
    {
        // First, check the initial index of the arguments.
        if (!isset($args[0])) {
            return false;
        }

        // Next, check the values of the arguments for the widget key and group.
        $args = $args[0];
        if (!isset($args[0]) && !isset($args[1])) {
            return false;
        }

        return true;
    }
}

Ja se tekee sen.

Valmiina etupäähän

Tässä vaiheessa meillä on käytössä mekanismi, joka voi tyhjentää widgetin välimuistin milloin tahansa – ei vain mukautetun tapahtuman avulla – vaan myös minkä tahansa WordPressin tarjoaman tapahtuman kanssa.

Tästä voi olla hyötyä, jos käytät Boilerplatea johonkin, joka käyttää välimuistissa olevaa kyselyä tai mitä tahansa muuta välimuistimekanismia, ja haluat varmistaa, että sisältö on selkeä.

Seuraavaksi aiomme tarkastella sisällön renderöimistä käyttöliittymässä. Olemme lähestymässä Boilerplaten uudelleenmuodostuksen loppua, mutta vielä on vähän tehtävää ennen kuin olemme valmiita yhdistämään sen koodikannan päähaaraan.

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