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.

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