1/29/2013

Wordpress - register and setup widgets from PHP code

PHP driven registration of the Widgets in Wordpress can be quite confusing. There is my way how to handle it:

class Widgets {

 private $widgets = [];
 private $options = [];

 public function __construct() {
  $this->options = wp_get_sidebars_widgets();
 }

 public function unregisterAllWidgets() {
  foreach ($this->options as $name => $values)
   $this->options[$name] = [];
 }

 public function cleanWidgetSettings($type, $multi = null) {
  $this->widgets[$type] = [];
  if ($multi !== null) $this->widgets[$type]['_multiwidget'] = (int)(bool)$multi;
 }

 public function setMultiWidget($type, $val = 1) {
  $this->widgets[$type]['_multiwidget'] = $val;
 }

 public function add($type, array $options, $area = null) {
  $this->widgets[$type][] = $options;
  if ($area !== null) {
   if (array_key_exists($area, $this->options) === false) {
    throw new Exception('Widget area ' . $area . ' not exists.');
   }
   end($this->widgets[$type]);
   $this->options[$area][] = $type . '-' . key($this->widgets[$type]);
  }
 }

 public function __destruct() {
  foreach ($this->widgets as $name => $settings) {
   if (!array_key_exists('_multiwidget', $settings)) $settings['_multiwidget'] = 1;
   update_option('widget_' . $name, $settings);
  }
  wp_set_sidebars_widgets($this->options);
 }

}

Following code is an example how to use class Witgets:

$widgets = new Widgets();
$widgets->unregisterAllWidgets();

$widgets->add('text', [
  'title' => 'About us',
  'text' => 'Simple text about us',
  'filter' => true,
  'classes' => '',
  'ids' => null,
 ],
 'footer-1'
);

// ...

This code need to be call only once. Put your code to function.php to after_switch_theme action:

add_action(
 'after_switch_theme', function () {
  $widgets = new Widgets();
  $widgets->unregisterAllWidgets();
  // ...
 }
);

https://gist.github.com/4663766/

#PHP #Wordpress

12/9/2012

Made in China - Paranoidní povídka na dobrou noc

China právě vyhlásila jednostranné embargo na vývoz výrobku vyrobených na jejich území. USA a prakticky celá Evropa se potýká s akutním nedostatkem výrobků určených k běžné spotřebě.

Chybí zejména elektronika, plastové a kovové výrobky a léků. Díky embargu došlo k ohrožení ekonomické stability řady firem. Na hranici bankrotu se pohybují firmy jako Apple, IKEA nebo Mattel.

Ty se překotně snaží alespoň o částečnou obnovu výroby. Rovněž se pokoušejí přesunout výrobu do svých domovských států.

Potýkají se se zoufalým nedostatkem odborníků a extrémní finanční náročností nechtěného stěhování.

Prezident USA se tento týden sejde s představiteli Evropské Unie.

Společně se pokusí dohodnout alespoň částečnou obnovu exportu výrobků vyrobených na území Chiny. Cílem je odvrátit celosvětový ekonomický kolaps. A zamezení chaosu do kterého se postupně propadají jednotlivé státy. O dalším vývoji situace Vás budeme průběžně informovat.

#lifehack

10/29/2012

WYSIWYG pro popis uživatele ve Wordpress

Následující kratičký kód zobrazí WYSIWYG editor u popisu autora u uživatelského profilu: Kód stačí přidat do function.php ve vašem template:

class CustomUserProfile {

private $tinymceOptions = array(
  'teeny' => true,
  'quicktags' => false,
  'media_buttons' => false, 'textarea_rows' => 8,
  'wpautop' => false,
  'tinymce' => array(
    'theme_advanced_buttons1' => 'p, bold, italic, ul, |,link,unlink,code',
    'theme_advanced_buttons2' => '',
    'theme_advanced_buttons3' => '',
    'theme_advanced_buttons4' => '',
  ),
);

public function __construct() {
  add_action('show_user_profile', array($this, 'initDescriptionWysywig'));
  add_action('edit_user_profile', array($this, 'initDescriptionWysywig'));
}

public function initDescriptionWysywig($options) {
  if ( ! class_exists('_WP_Editors' ) )
    require_once( ABSPATH . WPINC . '/class-wp-editor.php' );

  $options = _WP_Editors::parse_settings('description', $this->tinymceOptions);
  _WP_Editors::editor_settings('description', $options);
  wp_print_styles('editor-buttons');
}

}
new CustomUserProfile();

#PHP #Wordpress #WYSIWYG

9/15/2012

Hash tags pro Wordpress

Napsal jsem velmi jednoduchý plugin, který přidává do Wordpress podporu pro hash tagy:

<?php
/*
Plugin Name: Hashs
Description: Twitter like hash for Wordpress
Version: 1.0
Author: Roman Ozana <ozana@omdesign.cz>
Author URI: http://www.omdesign.cz/
*/
class Hashs {

  const PATTERN = '/\B#([^\s\W#]+)/i';

  /**
   * @param string $content
   * @return string mixed
   */
  public static function processContent($content) {
    return preg_replace(Hashs::PATTERN, '<a href="' . get_home_url(null, '/tag/$1') . '" class="tag">#$1</a> ', $content);
  }

  /**
   * Auto hash tags
   *
   * @param $post_id
   * @return bool
   */
  public static function addAutoTags($post_id) {
    $post = get_post($post_id);
    preg_match_all(Hashs::PATTERN, $post->post_content, $matches);
    if (!isset($matches[1])) return;
    wp_set_object_terms($post_id, $matches[1], 'post_tag', false); // replace
  }
}

add_filter('the_content', array('Hashs', 'processContent'), 1);
add_action('save_post', array('Hashs', 'addAutoTags'));

Povšimněte si zejména řádku wp_set_object_terms($post_id, $matches[1], 'post_tag', false); ten totiž ukládá nalezené tagy k postu. Pokud je poslední hodnota true, provede append (přidání ke stávajícím tagům). Pokud je false, provede nahrazení všech tagů u postu nalezenými hashtagy.

#PHP #Wordpress

9/5/2012

Zjištění práv k souboru nebo adresáři v PHP

function getPermisions($file) {
  return (is_dir($file) || is_file($file)) ? substr(decoct(fileperms($path)), -4) : '0000';
}

Nebo pro kontrolu, zda jsou práva dostatečná:

function hasPermisions($path, $permission = 777) {
  $current = substr(decoct(fileperms($path)), $permission > 1000 ? -4 : -3);
  return ($current > $permission);
}

#PHP

6/14/2012

Jak správně přepsat ojeté auto

Popíšu jak to probíhalo u mě. Kupoval jsem ojeté auto přímo od majitele. Platil jsem hotově bez úvěru. Auto má platnou technickou prohlídku a emise do roku 2015.

  1. uzavřeli jsme s majitelem kupní smlouvu, kde byl uveden VIN kód auta
  2. poslal jsme mu peníze na účet
  3. původní majitel odhlásil auto na spádovém dopravním inspektorátu (Praha)
  4. prostřihli mu tam malý TP
  5. do velkého TP mě jménem uvedl jako budoucího nového majitele (ušetří se tím plná moc v budoucnu)
  6. na VIN jsem si uzavřel s pojišťovnou povinné ručení
  7. původní majitel si teď už mohl své povinné ručení zrušit

S prostřiženým malým TP je možné jezdit bez úhony 10 dní, pak už se jedná o přestupek. Ale nikdy nesmíte vyjet na cestu s nepojištěným autem - proto povinné ručení. Je to dokonce tak přísné, že na smlouvě o povinném ručení je uvedena i hodina uzavření. Zelenou kartu tedy musíte mít v ruce už při převzetí auta od původního majitele. Rovněž auto nesmí na silnici pokud nemá platnou STK. To si jej pak musíte nechat odtáhnout rovnou na stanici STK a pokusit se ji obnovit.

Pokud chcete s autem jezdit, musíte do 10 dní dokončit úplný přepis na sebe. Což provedete na svém spádovém dopravním inspektorátu. V mém případě to je Ostrava - podle trvalého bydliště. Jedná se tedy o přepis mezi dvěma kraji.

Což znamená automaticky nutnost výměny registračních značek vozidla. Pokud se jedná pouze o přepis v rámci kraje, není výměna značek povinná. Záleží na novém majiteli, zda nové značky chce a připlatí si za ně. Pro dokončení přepisu budete potřebovat spoustu papírů: - občanku (doklad totožnosti)

  • doklad o způsobu nabytí vozidla (u mě kupní smlouva)
  • původní (staré) registrační značky vozidla
  • osvědčení o registraci vozidla část II (tzv. velký technický průkaz)
  • osvědčení o registraci vozidla část I (tzv. malý technický průkaz - ten prostřižený)
  • plnou moc k přepisu vozidla, pokud Vás majitel neuvedl jako budoucího majitele při odhlášení auta (což mě uvedl, takže jsem nepotřeboval)
  • doklad o technické prohlídce (zápis o platné pravidelné technické prohlídce v technickém průkazu nebo protokol o pravidelné technické prohlídce vystavený STK)
  • doklad o sjednání pojištění odpovědnosti z provozu vozidla (tzv. povinné ručení) tzv. zelená karta
  • žádost o přepis vozidla (dostanete a vyplníte na inspektorátu)
  • protokol o evidenční kontrole silničního motorového (viz. níže)

Pro úspěšný přepis auta potřebujete tzv. protokol o evidenční kontrole silničního motorového vozidla - ten získáte na jakékoliv stanici STK v ČR. K získání protokolu je nutné: - ukázat občanku

  • malý a velký technický průkaz
  • a auto.

Celkově záležitost na 5 minut. Pracovník STK zkontroloval VIN, barvu vozidla, stav tachometru a číslo motoru. Stálo to kolem 200 Kč. Platnost protokolu je opět 10 dní. Po předložení všech náležitostí jsem na inspektorátu dostal nové ostravské značky a nový neprostřižený malý technický průkaz. Všechno byla záležitost cca na 10 minut.

Stálo to na správních poplatcích 800 Kč. Kopii velkého technického průkazu jsem pak ještě poslal na pojišťovnu a ta mi obratem poslala novou zelenou kartu, kde je uvedena moje nová registrační značka. Ještě malý dodatek.

Pokud je v autě na skle nalepená dálniční známka, zneplatní se výměnou značek.

Dálniční známku si prý můžete nechat vyměnit na jakékoliv větší poště. Stačí k tomu původní známka a nový technický průkaz. Ještě jsem to nestihl udělat, takže přesně nevím.

Petr Novák: Dovoluji si doplnit, že podle odkazované stránky České pošty se při výměně značky dálniční známka nemění a zůstává platná, specificky to zmiňuje bod 2.13 jejich metodického pokynu. ( Možná to změnili, podle hlaviček ta stránka byla aktualizovaná 27. května letošního roku.)

Popis výměny dálniční známky najdete na stránkách České Pošty.

#lifehack

1/7/2012

Jak spočítat počet řádků kódu?

V mém příkladu počítám počet řádků PHP kódu:

grep -v '^ *$' `find . -iname "*.php"` | wc -l

Pro zajímavost takový Wordpress má více jak 250 000 řádků PHP.

#bash

10/15/2011

Jak okopírovat adresář s celým obsahem v PHP

Složitých a ošklivých funkcí pro kopírování adresářů a podadresářů vč. jejich obsahu jsem viděl několik. Tahle celkem běžná úloha jde vyřešit i jednoduše pomocí PHP iterátoru:

$source = "/foo/bar/dir";
$dest= "/dest/dir";

foreach (
 $iterator = new RecursiveIteratorIterator(
  new RecursiveDirectoryIterator($source, RecursiveDirectoryIterator::SKIP_DOTS),
  RecursiveIteratorIterator::SELF_FIRST) as $item
) {
  if ($item->isDir()) {
    mkdir($dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
  } else {
    copy($item, $dest . DIRECTORY_SEPARATOR . $iterator->getSubPathName());
  }
}

#PHP