Proč a jak na vlastní plugin pro WordPress

Dříve nebo později člověk narazí na potřebu vlastních úprav WordPressu. Internet je plný šikovných a povedených ukázek kódu u kterých se většinou píše: „Přidejte do functions.php vaší šablony“.

Jenže když to zapíšu do šablony, tak o změny přijdu s první aktualizací šablony! Řešením je použití tzv. Child Theme, kdy si šablonu zduplikuji, v té duplicitní si pitvám co chci, a pokud vyjde aktualizace originální šablony, o změny sice nepřijdu, ale musím si aktualizaci ručně aplikovat na mojí Child šablonu. To se mi taky nelíbí.

Řešením je tedy vlastní plugin pro WordPress, kde si všechny ty svoje změny napíšu a nic mi je nerozhodí (leda tak já, když udělám chybu).

Vytvoření pluginu je jednodušší než se zdá, stačí si ve složce wp-content/plugins/ vytvořit vlastní složku a v ní PHP soubor s následujícím obsahem:

<?php
/*
Plugin Name: WordPress.org Plugin
Plugin URI: https://web.archive.org/web/20181116103702/https://developer.wordpress.org/plugins/the-basics/
Description: Basic WordPress Plugin Header Comment
Version: 20160911
Author: WordPress.org
Author URI: https://developer.wordpress.org/
License: GPL2
License URI: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
Text Domain: wporg
Domain Path: /languages
*/

// vlasni kod

?>

Po vytvoření tohoto souboru, by se měl plugin objevit mezi ostatními pluginy a stačí ho jen aktivovat.

vlastni-plugin-01

Více o hlavičce v Header Requirements.

No a co do něj napsat?

Definice dalších typů souborů, které lze nahrát do Médií

Pokud chceme přes nahrávání médií vkládat na web i nějaké nestandardní typy souborů, WordPress nás standardně nenechá, podporuje jen běžné dokumenty, PDF, archivy. Tímto lze seznam podporovaných souborů rozšířit.

Na WP-Snippets je i nějaká trochu jiná verze.

/*
 * Pridani dalsich typů souboru do galerie medii
 * mimetypes: https://www.freeformatter.com/mime-types-list.html
 */
function my_mime_types( $mime_types ) {
  $mime_types['gip'] = 'application/zip';
  //$mime_types['ahk'] = 'text/plain';
  //$mime_types['bat'] = 'text/plain';
  //$mime_types['reg'] = 'text/plain';
  return $mime_types;
}
add_filter( 'upload_mimes', 'my_mime_types', 1, 1 );

Vlastní CSS styly

Jelikož šablona Hueman nepodtrhává odkazy, tak jsem to řešil úpravou jejích CSS souborů, ale to jsme zase na tam kde jsme byli. Stačí ale přidat asi dva řádky stylů, takže proč ke stávajícím stylům nepřihodit styl vlastní bez zásahu do šablony. Soubor custom.min.css je ve složce tohoto pluginu.

/*
 * Prilepeni vlastniho stylu hueman s podtrhanymi odkazy
 */
function add_custom_css() {
  wp_enqueue_style( 'mikrom-plugin', plugins_url( 'custom.min.css', __FILE__ ) );
}
add_action( 'wp_enqueue_scripts', 'add_custom_css' );

custom.min.css obsahuje zatím prakticky 4 minifikované řádky

div.entry.excerpt.entry-summary p {color: #666;} /* index - tmavsi pismo */
div.entry-inner a {text-decoration: underline;} /* post - podtrhane odkazy */
div.comment-body p a {text-decoration: underline;} /* comment - podtrhane odkazy */
article.type-page div.entry.themeform p a {text-decoration: underline;} /* page - podtrhane odkazy */

Edit: Od verze WordPressu 4.7 je možné si definovat vlastní CSS, takže toto už by nemělo být potřeba.

Remove query strings from static resources

Weby testující rychlost a optimalizaci webu nemají rádi, když jsou CSS a JS s parametry v url. S tím zatočí osvědčený kousek kódu.

/*
 * Remove query strings from static resources
 * https://web.archive.org/web/20220930010435/https://technumero.com/remove-query-strings-from-static-resources/
 */
function _remove_script_version( $src ) {
  $parts = explode( '?ver', $src );
  return $parts[0];
}
add_filter( 'script_loader_src', '_remove_script_version', 15, 1 );
add_filter( 'style_loader_src', '_remove_script_version', 15, 1 );

Clear WP Super Cache

vlastni-plugin-02

WP Super Cache je hezký a funkční plugin (dokonce jsem na něj přešel z W3 Total Cache viz WordPress. Nastavení, tipy a pluginy co jsem použil), jen jednu vadu má – pokud chceme smazat cache, tak se musíme proklikat hluboko do nastavení. Přitom by stačilo jen přidat odkaz do horní administrační lišty…

/*
 * Admin bar link to delete WP Super Cache's Cache.
 * Code from wp-super-cache-clear-cache-menu, https://apasionados.es/
 */
function only_show_option_if_wp_super_cache_is_active() {
  if ( is_plugin_active( 'wp-super-cache/wp-cache.php' ) ) {
    function clear_all_cached_files_wpsupercache() {
      global $wp_admin_bar;

      if ( !is_super_admin() || !is_admin_bar_showing() )
        return;

      $args = array(
        'id' => 'delete-cache-completly',
        'title' => 'Clear WP Super Cache',
        'href' => wp_nonce_url( admin_url( 'options-general.php?page=wpsupercache&amp;wp_delete_cache=1&amp;tab=contents' ), 'wp-cache' ),
        'parent' => '',
        'meta' => array(
          'title' => 'Clear all cached files of WP Super Cache'
        )
      );
      $wp_admin_bar->add_menu( $args );
    }
    add_action( 'wp_before_admin_bar_render', 'clear_all_cached_files_wpsupercache', 999 );
  }
}
add_action( 'admin_init', 'only_show_option_if_wp_super_cache_is_active' );

PayPal Donate

Občas by člověk chtěl k něčemu připojit PayPal tlačítko (né, že by mi někdy někdo něco přispěl  (ale najdou se výjimky)), tak jsem našel snippet jak si přidat vlastní shortcode. Výsledek pak může vypadat třeba takto: [donate account=“mikrom@mikrom.cz“]Donate Now[/donate].

/*
 * Paypal Donation Shortcode
 * from: https://www.isitwp.com/paypal-donation-shortcode-2/
 * use:
 *  [ donate]                                                                            - display default "Make A Donation" text and donate for is Post Title, no email
 *  [ donate]Donate Now[/donate]                                                         - display custom "Donate Now" text and donate for is Post Title, no email
 *  [ donate account="you@yoursite.com" onHover="Thanks" for="Title"]                    - display default "Make A Donation" text and custom donate for
 *  [ donate account="you@yoursite.com" onHover="Thanks" for="Title"]Donate Now[/donate] - display custom "Donate Now" text and custom donate for
 */
function _donate_shortcode( $atts, $content = null ) {
  global $post;
  extract( shortcode_atts( array(
    'account' => 'your-paypal-email-address',
    'for' => $post->post_title,
    'onHover' => '',
  ), $atts ) );
  if( empty( $content ) ) $content = 'Make A Donation';
    return '<a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=' . $account . '&item_name=Donation for ' . $for . '" title="' . $onHover . '">' . $content . '</a>';
}
add_shortcode('donate', '_donate_shortcode');

Vlastní Admin menu

vlastni-plugin-03

A od Clear WP Super Cache jsme už jen kousek od toho si do admin menu přidat libovolné důležité odkazy. Na to se hodí vlastní funkce pro jednodušší přidávání odkazů.

Funguje to tedy tak, že pouze přidávám/měním/mažu řádky custom_adminbar_item(); tak, že:

  • id_polozky musí být unikátní, nejjednodušší je tedy prosté číslování
  • parent_polozky udává nadřazenou položku, vhodné pro submenu, může se uvést prázdný string '' pak bude přímo v adminbaru
  • nazev_polozky je text zobrazený v menu
  • url_polozky je odkaz, může se uvést prázdný string ''
  • napoveda_polozky je volitelný parametr, zobrazuje se po najetí myši
/*
 * Adds admin bar items for easy access to the theme creator and editor
 * https://developer.wordpress.org/reference/classes/wp_admin_bar/add_node/
 * https://www.wpbeginner.com/wp-tutorials/how-to-add-custom-shortcut-links-to-wordpress-toolbar/
 *
 * syntaxe je custom_adminbar_item( 'id_polozky', 'parent_polozky', 'nazev_polozky', 'url_polozky', 'napoveda_polozky' );
 */
function custom_adminbar_menu() {
  custom_adminbar_item( '01', '', 'mikrom', '', 'mikrom-plugin.php' );
  custom_adminbar_item( '02', '01', 'OneBit', 'https://www.onebit.cz/cz/', 'onebit.cz' );
  custom_adminbar_item( '03', '02', 'MySQL', 'https://mysql.mikrom.cz/db_structure.php?server=1&amp;db=mikromcz1', 'PhpMyAdmin, mysql.mikrom.cz' );
  custom_adminbar_item( '04', '02', 'WebFTP', 'https://webftp.onebit.cz/', 'FTP, webftp.onebit.cz' );
  custom_adminbar_item( '05', '02', 'AwStats', 'http://awstats.mikrom.cz', 'awstats.mikrom.cz' );
  custom_adminbar_item( '06', '02', 'OneAdmin', 'https://www.oneadmin.cz/onebit/', 'oneadmin.cz/onebit' );
  custom_adminbar_item( '07', '02', 'Dealer', 'https://www.oneadmin.cz/dealer/', 'oneadmin.cz/dealer' );
  custom_adminbar_item( '08', '01', 'Google', 'https://www.google.com/', 'google.com' );
  custom_adminbar_item( '09', '08', 'Google Webmaster Tools (Search Console)', 'https://www.google.com/webmasters/tools/dashboard?hl=cs&amp;siteUrl=http%3A%2F%2Fmikrom.cz%2F', 'google.com/webmasters/tools/dashboard' );
  custom_adminbar_item( '10', '08', 'Google Analytics', 'https://analytics.google.com/analytics/web/?hl=cs&amp;pli=1#report/defaultid/a4857096w9370744p9778395/', 'analytics.google.com' );
  custom_adminbar_item( '11', '08', 'Google AdSense', 'https://www.google.com/adsense/app#main/home', 'google.com/adsense/app' );
  custom_adminbar_item( '12', '08', 'Google PageSpeed Insights', 'https://developers.google.com/speed/pagespeed/insights/', 'developers.google.com/speed/pagespeed/insights/' );
}
function custom_adminbar_item( $id, $parent, $title, $href, $metatitle='' ) {
  global $wp_admin_bar;

  $args = array(
    'id' => $id,
    'parent' => $parent,
    'title' => $title,
    'href' => $href,
    'meta' => array(
      'class' => 'class'.$id,
      'title' => $metatitle,
      'target' => '_blank'
    )
  );
  $wp_admin_bar->add_node( $args );
}
add_action( 'admin_bar_menu', 'custom_adminbar_menu', 999 );

A teď pozor!

Po tom co jsem vypotil výše zmíněný kus kódu, kde musím každý odkaz ručně dopsat, a přitom si stále hlídat id a parrent aby se menu nerozsypalo, mě napadlo využít menu přímo z WordPressu (Vzhled -> Menu)! Dyť to musí jít! No nepřišel jsem na to sám, ale jde to. A jelikož jsem to googlil asi dva týdny, tak to přidám sem.

Důležité jsou řádky 8 a 13, kde se definuje název menu vytvořeného ve WordPressu, a jaký text se bude zobrazovat v administrační liště.

/*
 * Admin bar custom menu
 * Create it in Menus! (Here is menu with name AdminBar)
 * from: https://wordpress.stackexchange.com/questions/15186/attaching-a-navigation-menu-to-the-admin-bar !!!
 */
function custom_admin_bar_menu( &$wp_admin_bar )
{
  $menu = wp_get_nav_menu_object( 'AdminBar' ); // Menu name in menu editor
  $menu_items = wp_get_nav_menu_items( $menu->term_id );

  $wp_admin_bar->add_menu( array(
    'id' => 'cust-menu-0',
    'title' => 'MyMenu', // Display name in AdminBar
  ) );

  foreach ( $menu_items as $menu_item ) {
    $wp_admin_bar->add_menu( array(
      'id' => 'cust-menu-' . $menu_item->ID,
      'parent' => 'cust-menu-' . $menu_item->menu_item_parent,
      'title' => $menu_item->title,
      'href' => $menu_item->url,
      'meta' => array(
        'title' => $menu_item->attr_title,
        'target' => $menu_item->target,
        'class' => implode( ' ', $menu_item->classes ),
      ),
    ) );
  }
}
add_action( 'admin_bar_menu', 'custom_admin_bar_menu', 100 );

A to je asi tak vše. Správně by měl ve složce pluginu být ještě soubor readme.txt (Plugin Readme Generator), měli bychom dodržovat jednotný styl psaní (WordPress PHP Coding Standards), měli bychom asi na začátku napsat něco v tomto duchu if ( ! defined( ‚ABSPATH‘ ) ) exit; // Exit if accessed directly, kdyby náhodou chtěl někdo spustit PHP přímo, ale takhle by se dalo vymýšlet donekonečna.

EDIT 17.12.2016: Další tipy třeba zde

EDIT 27.12.2016: Přidání oznámení o cookies, aneb proč na to instalovat samostatný plugin

/*
 * Cookie Bar
 * https://cookie-bar.eu/
 */
function _add_cookie_bar() {	
  wp_register_script( 'cookiebar', '//cdn.jsdelivr.net/cookie-bar/1/cookiebar-latest.min.js?theme=grey&scrolling=1', '', '', true );
  wp_enqueue_script( 'cookiebar' );
}
add_filter( 'wp_enqueue_scripts', '_add_cookie_bar' );

 

mikrom

Roman Mikulka aka mikrom. Ajťák, opravář, programátor samouk, elektrotechnik, koloběžkář a geocacher. Více na samostatné stránce O mně.

Mohlo by se vám líbit...

Subscribe
Upozornit na

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..

0 Komentáře
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x