[WordPress] meta box の位置を制御する

下北沢 OSS Cafe 確認スペシャルの補足
スケルトンだから、このままだと動かないよ。

<?php
new pan_pan_pan();

Class pan_pan_pan {
    private $field_name = array(
        'theme'   => 'pan_pan_pan_theme',
        'content' => 'pan_pan_pan_content',
    );
    CONST POST_TYPE  = 'pan_pan_pan';

    function __construct() {
        add_action( 'in_admin_header', array(&$this, 'in_admin_header') );
    }

    private function is_pan_pan_pan() {
        global $post_type;
        if ( isset($post_type) && $post_type === self::POST_TYPE )
            return TRUE;
        else if ( isset($_GET['post_type']) && $_GET['post_type'] === self::POST_TYPE )
            return TRUE;
        else
            return FALSE;
    }

    public function in_admin_header() {
        global $post_type, $current_user;

        if ( !$this->is_pan_pan_pan() )
            return;

        // 画面のカラム数の制御
        $screen_layout_columns = get_user_option("screen_layout_$post_type");
        if ( !$screen_layout_columns || $screen_layout_columns > 1 ) {
            update_user_option($current_user->ID, "screen_layout_$post_type", 1);
        }

        // メタボックスの表示位置の制御
        $meta_box_order_default = array(
            'side'     => '' ,
            'normal'   => "slugdiv,{$this->field_name['theme']},{$this->field_name['content']}",
            'advanced' => "submitdiv",
        );
        $meta_box_order = $meta_box_order_new = get_user_option("meta-box-order_$post_type");
        if ( $meta_box_order ) {
            // サイド
            $side = isset($meta_box_order['side'])
                ? explode(',', $meta_box_order['side'])
                : array();
            $meta_box_order_new['side'] = '';

            // ノーマル
            $normal = array_merge(
                explode(',', isset($meta_box_order['normal']) ? $meta_box_order['normal'] : $meta_box_order_default['normal']) ,
                $side
            );
            if ( !in_array($this->field_name['theme'], $normal) )
                $normal[] = $this->field_name['theme'];
            if ( !in_array($this->field_name['content'], $normal) )
                $normal[] = $this->field_name['content'];
            $meta_box_order_new['normal'] = implode(',', $normal);

            // advanced (サブミットボックスとか置いてある)
            $advanced = explode(',', isset($meta_box_order['advanced'])
                ? $meta_box_order['advanced']
                : $meta_box_order_default['advanced']);
            if ( !in_array('submitdiv', $advanced) )
                $advanced[] = 'submitdiv';
            $meta_box_order_new['advanced'] = implode(',', $advanced);
        } else {
            $meta_box_order_new = $meta_box_order_default;
        }
        if ( $meta_box_order !== $meta_box_order_new )
            update_user_option($current_user->ID, "meta-box-order_$post_type", $meta_box_order_new);

        // 隠したいメタボックスの制御
        $metaboxhidden = $metaboxhidden_new = (array)get_user_option("metaboxhidden_$post_type");
        if ( $metaboxhidden ) {
            if ( !in_array('categorydiv', $metaboxhidden) )
                $metaboxhidden_new[] = 'categorydiv';
            if ( !in_array('slugdiv', $metaboxhidden) )
                $metaboxhidden_new[] = 'slugdiv';
            if ( !in_array('commentstatusdiv', $metaboxhidden) )
                $metaboxhidden_new[] = 'commentstatusdiv';
        } else {
            $metaboxhidden_new = array('categorydiv','slugdiv','commentstatusdiv');
        }
        if ( $metaboxhidden !== $metaboxhidden_new )
            update_user_option($current_user->ID, "metaboxhidden_$post_type", $metaboxhidden_new);

        // 画面のカラム数の最大値を指定
        add_screen_option('layout_columns', array('max' => 1) );
    }
}

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() って関数名は、他のプラグインでも使われそうな関数名なので、変えた方が良いですね。

[WordPress] XMLRPC を拡張する

XMLRPC を拡張するプラグインの作り方、あとでメインブログに清書します。

プラグイン本体

<?php
/*
Plugin Name: Ex XMLRPC
Version: 0.0.1
Plugin URI: 
Description: 
Author: wokamoto
Author URI: http://dogmap.jp/
*/
function wpex_xmlrpc_server($class_name) {
	if (!class_exists('wpex_xmlrpc_server'))
		require_once 'class-wpex-xmlrpc-server.php';
	return 'wpex_xmlrpc_server';
}
add_filter('wp_xmlrpc_server_class', 'wpex_xmlrpc_server');
?>

class-wpex-xmlrpc-server.php

<?php
class wpex_xmlrpc_server extends wp_xmlrpc_server {
	function __construct() {
		parent::__construct();
		$this->methods['wpex.getWpVersion'] = 'this:wp_getVersions';
	}

	public function wp_getVersions( $args ) {
		global $wp_version, $wpdb;

		if ( count((array) $args) > 2 ) {
			$this->escape( $args );
			$blog_id = (int) $args[0];
			$username = $args[1];
			$password = $args[2];
		} else {
			return $this->error;
		}

		if ( !$user = $this->login($username, $password) )
			return array(
				'wp' => $wp_version ,
				'php' => PHP_VERSION ,
				'mysql' => $wpdb->db_version() ,
				);
		} else {
			return $this->error;
		}
	}
}

確認方法

<?php
require_once("XML/RPC.php");

$host = "example.com";
$xmlrpc_path = "/xmlrpc.php";
$appkey = '';
$user = 'username';
$passwd ='yourpassword';

$c = new XML_RPC_client($xmlrpc_path, $host, 80);
$appkey = new XML_RPC_Value($appkey, 'string');
$username = new XML_RPC_Value( $user, 'string' );
$passwd = new XML_RPC_Value( $passwd, 'string' );

// blog ID の取得
$message = new XML_RPC_Message(
	'blogger.getUsersBlogs',
	array($appkey, $username, $passwd)
	);
$result = $c->send($message);
if( !$result )
	exit('Could not connect to the server.');
else if( $result->faultCode() )
	exit($result->faultString());
$blogs = XML_RPC_decode($result->value());
$blog_id = new XML_RPC_Value($blogs[0]["blogid"], "string");

// 拡張された XMLRPC メソッド wpex.getWpVersion の取得
$message = new XML_RPC_Message(
	'wpex.getWpVersion',
	array($blog_id, $username, $passwd)
	);
$result = $c->send($message);
if( !$result )
	exit('Could not connect to the server.');
else if( $result->faultCode() )
	exit($result->faultString());
var_dump(XML_RPC_decode($result->value()));
?>

実行結果

array(3) {
  ["wp"]=>
  string(5) "3.2.1"
  ["php"]=>
  string(5) "5.3.6"
  ["mysql"]=>
  string(6) "5.5.14"
}

追記:
こんな面倒なことしなくても xmlrpc_methods ってフィルタに引っ掛ければ良いだけだった…orz
WordPressにおけるXMLRPCの開発・・メソッドの増やし方とか – それ図解で。・・・tohokuaikiのチラシの裏