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/

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 vyhnou se celosvětovému ekonomickému kolapsu. 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.

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();

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.

Zdrojový kód ke stažení zde: https://bitbucket.org/OzzyCzech/omhashtag

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);
}