Ako vytvoriť vlastný WordPress plugin

PHP
WordPress
Martin Saxa - 12. augusta 2024

Pluginy su časti kódu, ktoré rozšírujú funkcionalitu WordPressu. Písané sú v programovaciom jazyku PHP a taktiež väčšinou obsahujú časti kódu v JavaScripte a CSS. Pluginy môžu rozširovať WordPress o funkcionalitu ako optimalizácia obrázkov, pridanie shortcodes alebo widgetov, vlastných Gutenberg blokov, importovanie produktov do WooCommerce alebo vytvoriť kalendár podujatí pomocou vlastných článkov – custom post types. Taktiež upozorňujem, že pre tvorbu vlastných pluginov potrebujete programátorské schopnosti. Ak ich nemáte, neváhajte ma kontaktovať. Avšak, ak sa chcete o tvorbe pluginov niečo dozvedieť, nižšie si ukážeme tvorbu pluginu, ktorý zakáže komentáre na celej WordPress stránke. Tento plugin bude založený na tomto snippete s podobnou funkcionalitou. Budem používať VSCODE a Local WP ako vývojárske prostredie.

Tvorba priečinka s pluginom

Prvým krokom je vytvorenie priečinka s naším pluginom. Priečinok vytvoríme v wp-include/plugins nazveme remove-comments.

V ňom vytvoríme .php súbor s rovnakým názvom, ktorý bude obsahovať hlavičku s komentárom o našom plugine. Minimálna hlavička vyzerá tatko:

<?php

/*
 * Plugin Name: YOUR PLUGIN NAME
 */

Avšak celá hlavička vyzerá takto:

<?php

/**
 * Plugin Name:       Plugin Name
 * Plugin URI:        https://example.com/plugin-name
 * Description:       Description of the plugin.
 * Version:           1.0.0
 * Requires at least: 5.2
 * Requires PHP:      7.2
 * Author:            Your Name
 * Author URI:        https://example.com
 * Text Domain:       plugin-slug
 * License:           GPL v2 or later
 * License URI:       http://www.gnu.org/licenses/gpl-2.0.txt
 * Update URI:        https://example.com/my-plugin/
 * Requires Plugins:  my-plugin, yet-another-plugin
 */

V našom prípade:

<?php

/**
 * Plugin Name:       Remove Comments
 * Plugin URI:        https://saxa.dev/2024/08/10/ako-vytvorit-vlastny-wordpress-plugin/
 * Description:       Plugins thats disable comments site-wide.
 * Version:           1.0.0
 * Requires at least: 6.0
 * Requires PHP:      7.2
 * Author:            Martin Saxa
 * Author URI:        https://saxa.dev/
 * Text Domain:       remove-comments
 * License:           GPL v2 or later
 * License URI:       http://www.gnu.org/licenses/gpl-2.0.txt
 * Update URI:        https://example.com/my-plugin/
 * Requires Plugins:  
 */

Viac o hlavičke sa dočítate v dokumentácii.

(De)Aktivačné hooky a hook pre odinštaláciu.

WordPress nám ponúka hooky pre operácie, ktoré treba vykonať pri aktivácií pluginu, jeho deaktivácií a jeho vymazaní.

  • register_activation_hook( string $file, callable $callback ) – Aktivácia pluginu – napr. vytvorenie nových tabuliek v databáze
  • register_deactivation_hook( string $file, callable $callback ) – Deaktivácia pluginu – napr. vymazanie cache, ale dáta budu ponechané
  • register_uninstall_hook( string $file, callable $callback ) – Odinštalovanie pluginu – napr. odstránenie vlastných tabuliek, vymazanie všetkých dát z pluginu

Tieto hooky nepotrebujeme pri našom plugine, preto si ich neukážeme, ale je dôležité vedieť, že existujú. Viac sa o ních môžete dočitať v dokumentácií. Ale pre ukážku si ukážeme admin notifikáciu s textom Koniec komentárov pri aktivácií pluginu. Náš kód pod komentárom o informáciach o plugine bude vyzerať takto:

register_activation_hook(
    __FILE__,
    'saxa_activation'
);
function saxa_activation()
{
    set_transient('saxa_activation_admin_notice', true);
}

add_action('admin_notices', 'saxa_show_activation_notice');
function saxa_show_activation_notice()
{
    if (get_transient('saxa_activation_admin_notice')) {
?>
        <div class="notice notice-success is-dismissible">
            <p>Goodbye Comments!</p>
        </div>
<?php
        delete_transient('saxa_activation_admin_notice');
    }
}

Následne po aktivácií pluginu sa nám zobrazí okrem „bežnej“ notifikácií o aktivácií pluginu aj náš oznam. Taktiež si v kóde nezabuidnite všimnúť, že všetky naše názvy si prefixujeme naším menom. Ja som použil priezvisko ale je zvykom v pluginoch, ktoré sa používajú na viacerých weboch je vytvoriť skrátený a jedinečný prefix – meno + názov pluginu.

Samotná funkcionalita

Následne si za vložíme do nášho kódu samotnú funkcionalitu. Nezabúdajme, že kód „nebeží“ za sebou, ale najskôr sa zaregistrujú všetky actions a hooks. Následne oni spustia funkcionalitu kódu. Kód na odstránenie komentárov z WordPressu si skopírujeme z článku o snippete pre túto funkcionalitu.

add_action('admin_init', function () {
    // Presmerovať používateľa, ak by naštívil URL priamo
    global $pagenow;
     
    if ($pagenow === 'edit-comments.php') {
        wp_safe_redirect(admin_url());
        exit;
    }
 
    // Odstrániť Widget commentov z domovskej stránky admin panelu
    remove_meta_box('dashboard_recent_comments', 'dashboard', 'normal');
 
    // Odstránenie komentov a "trackbetov" ako druh príspevkov
    foreach (get_post_types() as $post_type) {
        if (post_type_supports($post_type, 'comments')) {
            remove_post_type_support($post_type, 'comments');
            remove_post_type_support($post_type, 'trackbacks');
        }
    }
});
 
// Vypnutie komentov na front-ende
add_filter('comments_open', '__return_false', 20, 2);
add_filter('pings_open', '__return_false', 20, 2);
 
// Skrytie existujúcich komentov
add_filter('comments_array', '__return_empty_array', 10, 2);
 
// Odstránenie komentárov menu položky v admine
add_action('admin_menu', function () {
    remove_menu_page('edit-comments.php');
});
 
// Odstránenie komentov z hornej admin lišty
add_action('init', function () {
    if (is_admin_bar_showing()) {
        remove_action('admin_bar_menu', 'wp_admin_bar_comments_menu', 60);
    }
});

Následne by sme už vo WordPresse nemali nájsť žiadne komentáre.

Záver

Verím, že ste sa týmto „pluginom“ niečo naučili. Bola to iba malá ukážka, ako sa WordPress rozširuje. Taktiež by som rád poznamenal, že tento plugin má ďaleko od štandardov pluginov, či kóderských alebo bezpečnostných. Ak máte potreby rozšíriť Vašu WordPress stránku, neváhajte ma kontaktovať.