Jednoduchý plugin do WordPressu

PHP, Google

Vlastní plugin do WordPressu nemusí být nic složitého a vše záleží, co od něj požadujete. Takový jednoduchý, i když úplně bez nastavení si dnes napíšeme.

Jednoduchý plugin do WordPressu

WordPress je momentálně nejrozšířenější redakční systém a tak do něj vzniká hodně pluginů. Já jeden takový potřeboval pro notifikování všech Androidích telefonů s novou aplikací Majáles Ostrava, kterou již co nejdříve dokončíme.

Volné pokračování s tvorbou nastavení ve článku Vlastní stránka s nastavením

Souborová struktura

Struktura souborů pluginů je velmi jednoduchá a máme na výběr 2 možnosti. Vytvoříme si složku a do ní vložíme stejně pojmenovaný PHP soubor. Pokud však je plugin jednoduchý a bude mít pouze 1 soubor, můžeme úroveň se složkou vynechat a vytvořit pouze 1 soubor.

Ať si vybereme jakoukoli možnost, složku s obsahem, nebo jediný soubor, vše uložíme do složky wp-content/plugins/

# V případě umístění souboru do složky, se hlavní soubor musí
# jmenovat stejně jako složka. Tento soubor bude WP hledat
wp-content/plugins/slozity-plugin/slozity-plugin.php

# Pokud náš plugin má jen 1 soubor, vložíme je přímo
wp-content/plugins/jednoduchy-plugin.php

Hlavička souboru

Hlavní soubor, musí obsahovat základní informace o pluginu, které se zapisují jako komentář na začátku. Povinný je pouze Plugin Name, můžete toho však vepsat mnohem více. Celý výčet možností najdete v Developers handbook.

<?php
/*
Plugin Name: GCM Sender
Description: Send notification to Google cloud messaging server.
Version: 1.0
Author: Pavel Kutáč
Author URI: https://www.kutac.cz/
*/

Kód pluginu

Nyní můžete již psát samotný kód, vašeho pluginu. Ten se již také objeví v administraci a můžete jej aktivovat. Zde je můj kód s komentáři uvnitř, který blíže popíše chování a možná přidá i nějaké tipy.

Jen zmíním, že samotný kód pluginu se nemusí nijak lišit od filtrů a akcí, které jinak můžete psát do functions.php. Pokud bych celý tento kód vložil do functions.php, fungovalo by to úplně stejně, kromě posledního bloku, který se spustí při aktivaci pluginu.

define('GCM_SENDED_META_MEY', 'sended2GCM');
 
 /**
  * Odeslání požadavku s ID poslední aktuality na Google cloud messaging server
  */
function sendGCM($post_id)
{
     // Ignorujeme revize, heartbeat a autosave
    if ( wp_is_post_revision( $post_id ) ||
        isset($_POST['data']['wp_autosave']) ||
        ( isset($_POST['action']) && $_POST['action'] == "heartbeat") ){
        return;
    }
  
    $post = get_post($post_id); 
    // Pokud post není novinka nebo není ve stavu publikování, nezajímá nás to
    if($post->post_status != "publish" || $post->post_type != "novinky"){
        return;
    }
    // Pokud obsahuje záznam v post_meta tabulce, notifikaci jsme již odeslali
    if(empty(get_post_meta($post_id, GCM_SENDED_META_MEY, true))){
        // Odeslání na požadavku na Google server
        $url = 'https://gcm-http.googleapis.com/gcm/send';
        $headers = array(
            'Authorization: key=AI*********************************',
            'Content-Type: application/json'
            );
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 
        curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(array(
            'to' => '/topics/Majales',
            'data' => array(
                'lastId' => $post_id
                )
            )));
        $result = curl_exec($ch);
        // Pokud Google požadavek přijal, uložíme k dané aktualitě příznak odeslání
        if ($result !== FALSE) {
            update_post_meta($post_id, GCM_SENDED_META_MEY, "1");
        }
        curl_close($ch);
    }
}
// Nastavíme akci s prioritou 1000, aby bylo možné případně jiným filtrem provést úpravy
add_action('save_post', 'sendGCM', 1000);
 
/**
  * V administraci upozorníme uživatele, že se aktualita odešle na server, pokud se tak ještě nestalo
  */
function notice_to_sending_GCM() {
    global $pagenow;
    global $post_type;
    global $post;

    // Jsme na stránce pro vytvoření nové novinky, nebo upravujeme starou
    if ($post_type == "novinky" and in_array($pagenow, array("post-new.php", "post.php"))) {
        $show = true;
        // Upravujeme starou, která již ale byla odeslána, nebudeme odesílat znova
        if ($pagenow == "post.php" and !empty(get_post_meta($post->ID, GCM_SENDED_META_MEY, true))) {
            $show = false;
        }
    }
    // Pokud novinka ještě nebyla odeslána, zobrazíme varování
    if ($show){
        ?>
        <div class="error">
            <p>Tato novinka bude v případě publikování okamžitě odeslána do všech Android zařízení.
            Zkontrolujte pořádně vše!</p>
        </div>
        <?php
    }
}
// Registrujeme akci pro zobrazení notifikací v administraci
add_action( 'admin_notices', 'notice_to_sending_GCM' );
 
/**
  * Po aktivaci pluginu označíme staré aktuality jako odeslané
  */
function gcm_sender_activate()
{
    global $wpdb;
    // Vybereme všechny aktuality, kromě naplánovaných, konceptů a čekajících na schválení
    // a označíme je jako odeslané, aby se neodeslaly v případě úpravy
    $wpdb->query("INSERT INTO {$wpdb->postmeta}
        SELECT NULL, P.ID, '".GCM_SENDED_META_MEY."', '1'
        FROM {$wpdb->posts} P
        WHERE P.post_type = 'novinky'
            AND P.post_type NOT IN ('future', 'auto-draft', 'pending', 'draft')
            AND NOT EXISTS (
                SELECT MP.meta_id
                FROM {$wpdb->postmeta} MP
                WHERE post_id =P.ID AND meta_key = '".GCM_SENDED_META_MEY."'
            )");
}
// Registrace aktivační funkce
// Spustí se pokaždé, pokud plugin přejde ze stavu neaktivní na aktivní
register_activation_hook(__FILE__, 'gcm_sender_activate');

Ukázka oznámení u Novinky, pokud ji budeme odesílat na Google server.

Upozornění na odeslání

Naplánované zveřejnění

Pokud ve WordPressu zvolíte, že se článek má publikovat v budoucnosti, článek se uloží se stavem future a tím pádem se ani neodešle upozornění. Když ale na článek dojde řada, WP upraví stav na public, čímž se opět zavolá save_post akce. Proto není žádný problém články plánovat a oznámení na Google se odešle i později.


Doufám, že vám článek pomůže ať u při psaní vlastních pluginů, nebo jen úpravě WordPressu. S případnými zkušenostmi se můžete podělit v komentářích.

K tomuto článku již není možné přidávat další komentáře