Jednoduchý plugin do WordPressu
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.
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.
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/.
1 2 3 4 5 6 7 |
# 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<code class=" language-bash"> |
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.
1 2 3 4 5 6 7 8 |
<?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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
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.
Napsat komentář