Re: WordPressでイベントカレンダー

WordPress ではウィジェットや get_calendar タグ/ファンクションを使って、ブログによくある投稿カレンダーを出力することができます。カレンダーの日付のリンク先は日付別アーカイブとなっているのですが、カレンダーの日付枠内に記事のタイトルを表示したいという要望がよくあります。巷ではイベントカレンダーと呼ばれるニーズですね。
そのようなことを実現するプラグインはありますが、他人のルールで作られたものは敬遠したいという方のために get_calendar をいじくる方法をご紹介します。さらにカレンダーに表示する記事はカテゴリーで指定できるようにします。

via. WordPressでイベントカレンダー  |  wpxtreme

添削するのは、パーマリンクから日付を取得する正規表現。

if(preg_match_all('@<td><a href="' . get_option('home') . '/(\?m=)?([^"]*?)" title="[^"]*?">([0-9]+?)</a>@i', $output, $matches)){
  foreach($matches[0] as $key => $match){
    $date  = preg_replace('@/@', '', $matches[2][$key]);
    $year  = substr($date, 0, 4);   // 年
    $month = substr($date, 4, 2); // 月
    $day   = substr($date, 6, 2);   // 日
    /* do stuff */
  }
}

これだと、http://example.com/archives/date/2011/11/21 とかの形式に対応できない。
こんな感じに修正。

    $date  = preg_replace('@^[^0-9]*([0-9]+)/?(0[0-9]|1[0-2])/?([0-2][0-9]|3[01]).*$@', '$1$2$3', $matches[2][$key]);
// http://example.com/?m=201001 や http://example.com/201001 の月別アーカイブリンクを
//   http://example.com/event-calendar/?ym=201001 の形式に変更する  
// 前後月リンクは td に next, prev の ID が付加されているのでそれを利用する
if(preg_match_all(
  '@<td( id="[prev|next]")?[^>]*?><a href="(' . get_option('home') . '/)(\?m=)?([^"]*?)" title="[^"]*?">[^<]+?</a>@i', 
  $output, $matches)){
  foreach($matches[0] as $key => $match){
    $ym  = preg_replace('@/@', '', $matches[4][$key]);
    $output = preg_replace(
      '@' . preg_quote($matches[2][$key]) . preg_quote($matches[3][$key]) . preg_quote($matches[4][$key]) . '@',   
      get_permalink() . '/?ym=' . $ym, 
      $output
    ); 
  }
}

同様にこんな感じ。

    $ym  = preg_replace('@^[^0-9]*([0-9]+)/?(0[0-9]|1[0-2]).*$@', '$1$2', $matches[4][$key]);

Re: 【ノンデザイナー向け】 WordPress で今風なページトップを超簡単に設置する方法

2011年くらいから、
ページをスクロールすると、フワっと表示されるページトップ(クリックするとページの一番上にいくやつ)が
流行ってますよね! 超簡単にコピペするだけで作れるソース作ったので、公開します!

via. 【ノンデザイナー向け】Wordpressで今風なページトップを超簡単に設置する方法 | しらさかブログ

僕が WordPress に実装するなら、こうかな?
以下を functions.php に追加。

// テーマの head 部で jQuery を読み込む
add_action('wp_print_scripts', 'add_print_scripts_jquery');
function add_print_scripts_jquery() {
    wp_enqueue_script('jquery');
}

// Scroll to Top 用のスタイルを head 部に追加
add_action('wp_head', 'add_scroll_to_top_style');
function add_scroll_to_top_style() {
    ?>
<style type="text/css">
#pagetop { display:none;position:fixed;right:10px;bottom:10px;z-index:100; }
#pagetop a { padding:5px;background:#ccc;color:#fff;display:block;font-size:20px;font-weight:bold;-webkit-border-radius:8px;-moz-border-radius:8px;border-radius:8px; }
</style>
    <?php
}

// Scroll to Top 用の JavaScript をフッター部に追加
add_action('wp_footer', 'add_scroll_to_top');
function add_scroll_to_top() {
    ?>
<script type="text/javascript">
jQuery(function($){
    $('body').append(
        $('<div id="pagetop">')
        .append(
            $('<a href="#">↑</a>')
            .click(function(){$('html,body').animate({scrollTop:0}, 800, 'swing')})
            )
        );
    $(window).scroll(function () {
        if ($(this).scrollTop() > 100) {
            $('#pagetop').fadeIn();
        } else {
            $('#pagetop').fadeOut();
        }
    });
});
</script>
    <?php
}

本当は、css とか JavaScript とかは別ファイルにして外出ししたほうが良いと思うけど、まぁ簡単にコピペでできるってことで。

[WordPress] Post Class から Post ID を消す

ただ、post-IDとかの消し方が良く分からない。というか考えてない。wp-includes/post-template.phpあたり見れば良さそうですけども・・

僕はさほど実害無いので消さなくてもいいやって感じなんですけど、簡単に消せる自由もあってもいい気もしますね。あるのかな?w

お前そんな事も出来ないのか、みたいな素敵なデベロッパーさんからのトラバお待ちしています。
via. お手軽WordPress Tips:post_class()にアイキャッチ画像を使用した記事の場合のclassを追加する – かちびと. net

って、ことなので。

function remove_postid_class($classes, $class, $post_id) {
	if( $key = array_search('post-' . $post_id, $classes) )  {
		unset($classes[$key]);
	}
	return $classes;
}
add_filter('post_class', 'remove_postid_class', 10, 3);

あと、本文内のコードは、こうすれば global $post 使わなくても良いよ。(未検証)

function add_eyecatch_class($classes, $class, $post_id) {
	if( has_post_thumbnail($post_id) ) {
		$classes[] = 'eyecatch'; 
	}
	return $classes;
}
add_filter('post_class', 'add_eyecatch_class', 10, 3);

Re: これ、どう考えてももっと短くなる気がしてならない

http://twitter.com/#!/shinichiN/status/113883259829628928

if ( $_POST['cawaii_desuka'] == 'yes' ) {
    if ( isset($_POST['bg_css']) ) {
        $bg_css = $_POST['bg_css'];
    }
    if ( $bg_css == 'bg_brown' || $bg_css == 'bg_check' || $bg_css == 'bg_none' ) {
        update_option('bg_css', $bg_css);
    }
}

短くするならこうかな?(未検証)

if (isset($_POST['cawaii_desuka']) && $_POST['cawaii_desuka'] === 'yes') {
    $bg_css = isset($_POST['bg_css']) ? $_POST['bg_css'] : '';
    preg_match('/^bg_(brown|check|none)$/', $bg_css) && update_option('bg_css', $bg_css);
}

わかりやすいのならこう

if (isset($_POST['cawaii_desuka']) && $_POST['cawaii_desuka'] === 'yes') {
    $bg_css = isset($_POST['bg_css']) ? $_POST['bg_css'] : '';
    switch ($bg_css) {
        case 'bg_brown':
        case 'bg_check':
        case 'bg_none':
            update_option('bg_css', $bg_css);
    }
}

Hello Wapuu

「Hello Wapuu」プラグインは、「サイトの更新を応援するツール」を目指しています。

つまり、サイトを更新する応援キャラクターとして、「わぷー(Wapuu)」が登場して、サイトの更新を応援する、というような、運営者のモチベーションアップに繋がるプラグインを目指しています。

via. 「Hello Wapuu」というWordPress日本キャラクター「わぷー」を使ったプラグインを作りました。 | WordPress(ワードプレス)コミュニティ

このプラグイン中の最終更新日を取得するコード

function get_last_update(){
  global $wpdb;
  $date = $wpdb->get_results(
  ("
    SELECT MAX(post_date) as last
    FROM $wpdb->posts
    WHERE post_status = 'publish'
  ");
  return $date[0]->last;
}

惜しい、非常に惜しい。これだとマルチユーザに対応できない。
僕なら、こう書く。

function get_last_update(){
  global $wpdb;
  $current_user = wp_get_current_user();
  $date = $wpdb->get_results(
    $wpdb->prepare("
      SELECT MAX(post_date) as last
      FROM $wpdb->posts
      WHERE post_status = 'publish'
      AND post_author = %d
    ", (int)$current_user->ID
    )
  );
  return $date[0]->last;
}

あと get_last_update() って関数名は、他のプラグインでも使われそうな関数名なので、変えた方が良いですね。

[PHP] JSON を処理する

$request_url = 'http://search.twitter.com/search.json?lang=ja&q=ohayo';
$ch = curl_init($request_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$jsonData = curl_exec($ch);
curl_close($ch);

$jsonData = json_decode ($jsonData, true);

foreach($jsonData->results->from_user_id_str as $r) {
    $usr = $jsonData->results->from_user;
    $text = $jsonData->results->text;
    $c_at = $jsonData->results->created_at;

    $img = '<img src=\"'.$results->profile_image_url.'\">';
    $post = $img."<br />"."<strong>".$usr."</strong>(".$c_at.")<br />".$text."<br />";
}


via Twitter検索のJSONを読みたいのですがどうすればいいのでしょう? – Yahoo!知恵袋

json_decode の第二引数を true にすると、連想配列で結果を返すし、false(デフォルト)にするとオブジェクトで結果を返すよ。

そもそも、foreach の中にもバグが有る。

$request_url = 'http://search.twitter.com/search.json?lang=ja&q=ohayo';
$jsonData = file_get_contents($request_url);
$jsonData = json_decode($jsonData);
foreach($jsonData->results as $r) {
        $usr  = $r->from_user;
        $text = $r->text;
        $c_at = $r->created_at;

        $img  = "<img src=\"$profile_image_url\">";
        $post = "$img<br /><strong>$usr</strong>($c_at)<br />$text<br />";
}

[WordPress] 記事中の最初の画像を自動検出して表示

function catch_that_image() {
    global $post, $posts;
    $first_img = '';
    ob_start();
    ob_end_clean();
    $output = preg_match_all('/<img.+src=[\'"]([^\'"]+)[\'"].*/>/i', $post->post_content, $matches);
    $first_img = $matches [1] [0];

    if(empty($first_img)){ //Defines a default image
        $first_img = "/images/default.jpg";
    }
    return $first_img;
}

via 記事中の最初の画像を自動検出して、表示する方法

ob_start(), ob_end_clean() が意味不明。
preg_match_all でマッチしなかった時の対応は?
$post がセットされてなかった時の対応は?

っつうわけで書き直し

function catch_that_image() {
    global $post;

    return
      isset($post) && preg_match('/<img.+src=[\'"]([^\'"]+)[\'"][^¥/>]*/>/i', $post->post_content, $matches)
      ? $matches [1]
      : "/images/default.jpg";
}