Základní php funkce pro vývojáře WordPressu

Když není do čeho píchnout, dělám malé weby mám chvilku, dělám webíky pro známé. Dělám svoje vlastní šablony a během tvorby jsem se setkal s těmito specialitami:

Jak přidat do menu (main-menu) class nav-link?

//add class="nav-link" to href in li in menu
add_filter( 'nav_menu_link_attributes', 'add_specific_menu_location_atts', 10, 3 );
function add_specific_menu_location_atts( $atts, $item, $args ) {
	// check if the item is in the primary menu
	if( $args->theme_location == 'main-menu' ) {
		// add the desired attributes:
		$atts['class'] = 'nav-link';
	}
	return $atts;
}

V administraci pro pro uživatele id 2 skryj položky z menu:

function remove_menus(){
	if(get_current_user_id() == 2) {
		//hide for user id 2
		remove_menu_page('index.php');                  //Dashboard
		remove_menu_page('jetpack');                    //Jetpack*
		remove_menu_page('edit.php');                   //Posts
		//remove_menu_page('upload.php');                 //Media
		//remove_menu_page('edit.php?post_type=page');    //Pages
		remove_menu_page('edit-comments.php');          //Comments
		remove_menu_page('themes.php');                 //Appearance
		remove_menu_page('plugins.php');                //Plugins
		remove_menu_page('users.php');                  //Users
		remove_menu_page('tools.php');                  //Tools
		remove_menu_page('options-general.php');        //Settings
		remove_menu_page('WP-Lightbox-2');        		//WP Lightbox 2
	}
}
add_action( 'admin_menu', 'remove_menus' );

Jak v administraci použít vlastní css styl pro editor?

add_action( 'init', 'load_custom_wp_admin_editor_styles' );
function load_custom_wp_admin_editor_styles() {
	add_editor_style( get_template_directory_uri() . '/css/admin-style.css' );
}

Vytvářená galerie bude mít defaultně předvolené 4 sloupce fotek:

/**
 * Default 4 colums in gallery
 * @param $settings
 * @return mixed
 */
function theme_gallery_defaults( $settings ) {
	$settings['galleryDefaults']['columns'] = 4;
	return $settings;
}
add_filter( 'media_view_settings', 'theme_gallery_defaults' );

Vytvářená galerie bude mít automaticky předvolen URL odkazu na mediální soubor:

/**
 * Gallery default URL odkazu: medialni soubor
 */
add_filter( 'shortcode_atts_gallery',
	function( $out ){
		$out['link'] = 'file';
		return $out;
	}
);

U nahrávání fotek do mediálních souborů odeber titulek fotky a popis (některé foťáky tam ukládají nesmysly):

/**
 * Automatically set the title as caption to empty
 *
 * @see https://wordpress.stackexchange.com/a/188708/26350
 */
add_filter( 'wp_insert_attachment_data', function( $data, $postarr )
{
	// Let's target only the uploading process and not the updating of attachments:
	if( isset( $postarr['ID'] ) && 0 == $postarr['ID'] ) {
		$data['post_excerpt'] = "";
		$data['post_title'] = "";
	}

	return $data;
}, 10, 2 );

Automatická aktualizace:

//auto actualise
//plusing
add_filter( 'auto_update_plugin', '__return_true' );
//themes
add_filter( 'auto_update_theme', '__return_true' );
//wp
define( 'WP_AUTO_UPDATE_CORE', true );

 

WordPress jak na shortcode

Namotivován ze včerejší WPkonference sedám ke stroji a jdu vylepšit můj plugin pro fotogalerii rajče. Plugin nyní zobrazuje naposledy vytvořené galerie s úvodní fotkou. Rozhodl jsem se použít shortcode pro zobrazení celé galerie.

Shortcode je příkaz který na svém místě zavolá funkci a zobrazí html kód. Například následující shortcode by zobrazil fotogalerii [forogalerie]. Shortcode můžeme používat ve stránce i příspěvku.

Jak použít shortcode

Pro zpracování takto definovaného shorcode:

[rajce-galerie url="http://sdh-zabori.rajce.idnes.cz/Stedry_den_v_hospode_20.12.2015/"]

Použijeme nejjednodušší metodu:

// [rajce-galerie id="123" size="medium"]
function rajceGalleryFunc( $atts ) {
    $attsArray = shortcode_atts( array(
        'url' => NULL
    ), $atts );

    $return = "<div class=\"rajce-gallery\">";

    if($attsArray['url'] != "") {
       $return.= "RAJCE GALERIE URL: {$a['url']}";
    }

    $return.= "</div>";

    return $return;
}
add_shortcode( 'rajce-galerie', 'rajceGalleryFunc' );

Příkazem add_shorcode definujeme nový shortcode. První parametr označuje název shortoce ( [rajce-galerie … ) a druhý parametr je název funkce, která se zavolá pro tento shortcode.

Ve funkci si můžeme sáhnout na parametry uvedené u shortcode, kde definujeme defaultní hodnotu, pokud parametr není uveden. V mím případě NULL:

    $attsArray = shortcode_atts( array(
        'url' => NULL
    ), $atts );

Pak už si s parametry můžeme dělat co chceme 🙂

WordPress – jak v PHP nastavit cron (wp_cron)

Dnes si ukážeme jak v pluginu pro WordPressu nastavit wp_cron. Cron je script (ve WP světě funkce) který se spustí vždy v požadovanou dobu.

Jediné případné použití je na hostingu, který nepodporuje cron, nebo má omezený počet úloh pro cron. Wp_cron totiž funguje tak, že když přijde návštěvník na web, podívá se zda uplynula doba na spuštění cron úlohy. Pokud doba uplynula spustí cron úlohu a poznamená si čas kdy tato úloha byla naposledy spuštěna aby věděl kdy ji spustit příště.

To je fajn ale má to několik nedostatků:

  • Pokud na Váš web za celý den nepřijde žádný člověk, nevykoná se cron pro hourly četnost ani jednou (normálně by se vykonal 24x)
  • Pokud máte cron úlohu, která se vykonává dlouho, návštěvník který tuto úlohu “spustil” musí počkat než doběhne aby se mu zobrazila požadovaná stránka

Raději doporučuji spouštět kód klasickým cronem.

Ukázka nejjednoduššího cronu, který se vykoná každou hodinu – odesílá email:

if ( ! wp_next_scheduled( 'my_task_hook' ) ) {
  wp_schedule_event( time(), 'hourly', 'my_task_hook' );
}

add_action( 'my_task_hook', 'my_task_function' );

function my_task_function() {
  wp_mail( 'your@email.com', 'Automatic email', 'Automatic scheduled email from WordPress.');
}

Cron pro WordPress plugin

U pluginu je nejrozumnější cron zapnout při aktivaci pluginu. Nezapomeňte cron opět odebrat při deaktivaci pluginu.

Jak zjistím, že plugin byl aktivován nebo deaktivován?

function activate_plugin_name() {
   //plugin byl aktivovan
}

function deactivate_plugin_name() {
   //plugin byl deaktivovan
}
register_activation_hook( __FILE__, 'activate_plugin_name' );
register_deactivation_hook( __FILE__, 'deactivate_plugin_name' );

Jednoduché, ale stálo mne to dost vlasů 🙂 Finální kód pro plugin:

/**
 * Tento kod se vykona pri aktivaci pluginu
 */
function activate_plugin_name() {
   if( !wp_next_scheduled( 'mycronjob' ) ) {
      wp_schedule_event( time(), 'hourly', 'mycronjob' );
   }
}
/**
 * Tento kod se vykona pri deaktivaci pluginu
 */
function deactivate_plugin_name() {
   wp_clear_scheduled_hook('mycronjob');
}
//hook pro aktivaci a deaktivaci pluginu
register_activation_hook( __FILE__, 'activate_plugin_name' );
register_deactivation_hook( __FILE__, 'deactivate_plugin_name' );

/**
 * Funkce s vykonym kodem pro cron ulohu
 */
function my_repeat_function() {
   file_put_contents( realpath(dirname(__FILE__)) . "/cron.txt", date( "d.m.Y H:i:s" ) . " cron\n", FILE_APPEND);
}

Doufám, že pomůže 🙂

WooCommerce: získání všech tagů a kategorií

Poslední dobou dělám věci okolo WordPressu a Woocommerce. Dnes si ukážeme jak v doplňku získávám všechny kategorie a tagy.

Jak získat všechny tagy?

Function Reference/get terms

$taxonomies = 'product_tag';
$args = array(
   'taxonomy'     => 'product_cat',
   'hide_empty'   => 0
);
$terms = get_terms($taxonomies, $args);
foreach ($terms as $term) {
   //var_dump($term);
   //$termLink = get_term_link( $term );
   echo $term->name;
}

 

Jak získat všechny kategorie?

Function Reference/get categories

$args = array(
   'taxonomy'     => 'product_cat',
   'hide_empty'   => 0
);
$categories = get_categories( $args );
foreach( $categories as $category ) {
   //var_dump($category);
   //$categoryLink = get_category_link( $category );
   echo $category->name;
}

 

2. WordPress konference – Hluboká nad Vltavou

Druhá WordPress konference je za námi. Povedla se!

Celý program probíhal v hotelu Záviš z Falkenštejna kde o celou akci(přibližně 80 lidí) bylo perfektně postaráno. Přednášky vycházely z konceptu Komunitní výzvy („Podpoř ostatní tím, co umíš“) a byly bez nároku na honorář. Celá akce byla štědře sponzorována firmou WEDOS s možností prohlídky datacentra.

Celá konference navíc měla i sociálně-lidský rozměr díky tweetu od @jakubloudat: „Kdo mi sežral kuře“.

Přednášky na sebe příjemně navazovaly a měly koule. U žádné jsem se nenudil.

Pro ty které se nemohli zúčastnit přidávám záznam.

Radek Kučera – Základní zabezpečení WordPressu – video
Jakub Klapka – Jak zrychlit WP pomocí cachovacích pluginů – video
David Biňovec – Principy cachování ve WordPressu – video
Tomáš Andrlík – WordPress a členské sekce – video
Daniel Dubravec (Wedos) – Nejčastější problémy s WordPress, které řeší zákaznická podpora – video
Vladislav Musílek – Tvorba pluginů – video
Petr Bechyně – Google analytics pro vývojáře a designéry – video
Zdeněk Dvořák –  Jak získávat a udržovat odkazy s WordPressem – video
Michal Kubíček – Jak proměnit WordPress ve stroj na peníze – video

Mne osobně nejvíce potěšil Vladislav Musílek s tvorbou pluginů. Petr Bechyně jako vždy nezklamal.

Největší překvapení pro mne byla diskuse u večeře ( řízek jsem dostal 😀 ). Několik spolusedících vůbec neznalo ceny WEDOSu a divilo se jak nízké ceny má.

Děkuji naswp.cz a WEDOS za uspořádání této skvělé akce a budu se těšit příště.

Nejlevnější webhosting