26. 3. 2013

Toggle Hidden Files in Finder

Run Automator and create new Application. Add task Run Shell script and paste follow code:

STATUS=`defaults read com.apple.finder AppleShowAllFiles`
if [ $STATUS == YES ];
then
    defaults write com.apple.finder AppleShowAllFiles NO
else
    defaults write com.apple.finder AppleShowAllFiles YES
fi
killall Finder

Save application. From now can Tooggle

#macOS #bash

11. 3. 2013

List all mounted drives on Mac

It's simple: df -h

#macOS #bash

20. 2. 2013

Wodpress constants for human-readable intervals

Constants for expressing human-readable intervals in new #Wordpress are very useful:

define( 'MINUTE_IN_SECONDS', 60 );
define( 'HOUR_IN_SECONDS',   60 * MINUTE_IN_SECONDS );
define( 'DAY_IN_SECONDS',    24 * HOUR_IN_SECONDS   );
define( 'WEEK_IN_SECONDS',    7 * DAY_IN_SECONDS    );
define( 'YEAR_IN_SECONDS',  365 * DAY_IN_SECONDS    );

Example:

wp_cache_add($key, $data, 'default, 5 * DAY_IN_SECONDS);

#Wordpress

8. 2. 2013

Make WordPress globals more accessible

Wordpress using a lot globals variables. These variables are used throughout WordPress code for various reasons. Great example is database connection object wpdb. Here is common example how to use wpdb in some function:

function something() {
  global $wpdb;
  /** @var wpdb $wpdb */
  $wpdb->query('SQL...');
}

It's highly uncomfortable and long! Therefore, I have prepared a simple object which make all global variables much more accesible from anywhere: https://gist.github.com/OzzyCzech/4737518 (PHP 5.3+ only)

function something() {
 Globals::wpdb()->query('SQL...');
}

#Wordpress

29. 1. 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

9. 12. 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

29. 10. 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

15. 9. 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