Hatena::ブログ(Diary)

130単位

2011-05-25

サブディレクトリ型マルチサイト内でWordPressでないサブディレクトリの有効化

要件

public_html
├── static_site
│   └── index.html
├── wp-admin
├── wp-content
├── wp-includes
├── .htaccess
├── index.php
└── ...

public_htmlがDocumentRootで、static_siteを静的サイトとして扱いたいってことですね。

サブディレクトリ型マルチサイトを導入してしまうと、.htaccessに書かれたRewriteRuleの影響で、普通にはサブディレクトリはアクセスすることができません。

対策

(別の) .htaccess を利用します。

ディレクティブは現れる 順番に適用されます。ですから、あるディレクトリ.htaccessディレクトリツリーのより上の階層の .htaccess ファイルの 設定を上書きするかもしれません

Apache チュートリアル: .htaccess ファイル - Apache HTTP サーバ

つまり、該当サブディレクトリ.htaccessを設置すれば、そちらが優先されるということです。

上記の例だと、static_site/.htaccess に以下のように記述します。

RewriteEngine off

これでサブディレクトリstatic_siteにアクセスできます*1

ちなみにこの方法を利用すれば、サブディレクトリ型マルチサイトWordPress内に全く用途の異なる別の単体WordPressを設置することも可能です。

*1:当然ながらWordPress側ではstatic_siteという名前は使えなくなります

2011-04-20

ダッシュボードから不要なウィジェットを無効化 #WordPress

お題

  • ダッシュボードで扱えるウィジェットを「テキスト」のみにしたい

環境

案1

<?php
function disable_widgets() {
    global $wp_widget_factory;
    foreach ($wp_widget_factory->widgets as $widget_class => $widget) {
        if ($widtet_class !== 'wp_widget_text') {
            unregister_widget($widget_class);
        }
    }
}
add_action('widgets_init', 'disable_widgets', 99);

案2

<?php
function disable_widgets() {
    global $wp_registered_widgets;
    foreach ($wp_registered_widgets as $idx => $widget) {
        if ($widget['classname'] !== 'widget_text') {
            unset($wp_registered_widgets[$idx]);
        }
    }
}
add_action('widgets_admin_page', 'disable_widgets');

そんなわけで、プラグインにも対応できる案2でやるのがいいかと思います。コードはテーマのfunctions.phpに追加またはプラグイン化してください。他のウィジェットを有効化する場合は名前を調べて条件式に追加してください。深くは調べてないので副作用があるかもしれません。あったらご連絡ください><


4883377377
WordPress関数リファレンスガイド

関連リンク

2010-12-29

WordPress マルチサイト プログラムでデータ更新

マルチサイトの構成でブログが最初から10個以上とかある場合、全ブログの設定を変更してまわるのは面倒な作業です。そこで、プログラムで一気に設定変更する一例を載せてみます。

全ユーザーのデータ更新

<?php
require_once('wp-load.php');
require_once(ABSPATH . WPINC . '/registration.php');

$users = $wpdb->get_results("SELECT * FROM wp_users");
foreach ($users as $user) {
    //ユーザーのデータ取得
    $user = get_userdata($user->ID);

    //ニックネームと表示名変更
    $user->nickname = 'nickname';
    $user->display_name = 'display_name';

    //ユーザー基本情報更新
    wp_update_user(get_object_vars($user));

    //ユーザー付属情報更新
    update_user_meta($user->ID, 'meta_key', 'meta_value');
}

全ブログのデータ更新

<?php
require_once('wp-load.php');

$sites = $wpdb->get_results("SELECT * FROM wp_blogs");
foreach ($sites as $site) {
    //対象のブログに切り替え
    switch_to_blog($site->blog_id);

    //最初の記事削除
    $wpdb->query("UPDATE {$wpdb->posts} SET post_status = 'trash' WHERE ID = 1");

    //管理者メールアドレス変更
    update_option('admin_email', 'mail@example.com');

    //カテゴリー追加
    wp_insert_term('add_category_name', 'category');

    //元のブログに戻す
    restore_current_blog();
}

上記をWordPressのルートに配置してアクセスするか実行すればokです。ユーザーやブログのIDをキーにした配列を用意しておいて、ループ内で使うといいと思います。設定が済んだらファイルは消しましょう。

※WordPress3.0.3で検証

4883377377
WordPress関数リファレンスガイド

488337730X
PHPによるWordPressカスタマイズブック―3.x対応


【関連記事】
WordPress クイック編集で投稿ユーザーが変更されるのを防ぐ - 130単位
Wordpress Peter's Collaboration E-mailsをマルチサイトで動かす - 130単位
WordPress Ajaxで翻訳がうまくいかない原因と対処 - 130単位

2010-12-28

WordPress クイック編集で投稿ユーザーが変更されるのを防ぐ

マルチサイトで以下のような構成とします。

  • メインブログ
    • 特権管理者ユーザーのみ
  • サブブログ
    • 寄稿者ユーザーのみ
    • 特権管理者ユーザーは追加しない

この構成だと、以下のような問題が起きます。

  • 寄稿者がレビュー待ちで投稿
  • 特権管理者がクイック編集で記事のステータスを変更
  • 記事の投稿ユーザーが自動的に特権管理者に変更される
  • 寄稿者が編集できなくなる

ちなみに通常の編集では問題は起きません。

これを解決する方法のひとつは、サブブログにも特権管理者ユーザーを追加することです。しかしサブブログの数が多かったりすると手間ですし、ブログ追加の度にユーザーも追加しなければいけません。

そこでもうひとつの方法。記事一覧(のクイック編集)を出力している部分を変更します。

wp-admin/includes/template.php L933

<?php
//if ( $authors && count( $authors ) > 1 ) :
if ( $authors ) :

投稿できるユーザーが1人でもセレクトボックスを表示させるようにします。これでクイック編集で更新しても投稿ユーザーはそのままになります。

ただし本体のカスタマイズになるので注意が必要です。また検証はWordPress3.0.3ですが、3.1ではコードががらっと変わっているっぽいです。


4797360887
WordPressスーパーカスタマイズ 3.0対応 ポテンシャルを100%引き出すテクニック


【関連記事】
Wordpress Peter's Collaboration E-mailsをマルチサイトで動かす - 130単位
WordPress Ajaxで翻訳がうまくいかない原因と対処 - 130単位
WordPress 条件により翻訳テキスト切り替え - 130単位

2010-12-27

Wordpress Peter's Collaboration E-mailsをマルチサイトで動かす

WordPress › Peter's Collaboration E-mails « WordPress Plugins
http://wordpress.org/extend/plugins/peters-collaboration-e-mails/

投稿記事の承認ワークフローを可能にするプラグインです。具体的には、

  • レビュー待ちとして記事が投稿された
  • レビュー待ちの記事が公開された
  • レビュー待ちの記事が下書きに戻された

このような動作をしたときにユーザーへのメール通知が可能になります。プラグイン内の言語ファイルによりデフォルトで日本語に対応しています。

ただしマルチサイトに対応していないため、少しプラグインのコードをいじります。

ファイル編集

peters-collaboration-e-mails/peters_collaboration_emails.php L60-75

<?php
global $pce_db_group;
// Name of the database table that will hold group information and moderator rules
//$pce_db_group = $wpdb->prefix . 'collaboration';
$pce_db_group = 'wp_collaboration';

global $pce_db_collab;
// Name of the database table that will hold group - collaborator associations
//$pce_db_collab = $wpdb->prefix . 'collabwriters';
$pce_db_collab = 'wp_collabwriters';

global $pce_db_cats;
// Name of the database table that will hold category-specific moderators
// This table is no longer used, but defined here for upgrading and uninstalling purposes
//$pce_db_cats = $wpdb->prefix . 'collabcats';
$pce_db_cats = 'wp_collabcats';

global $pce_db_collabrules;
// Name of the database table that will hold post-type-specific moderators
//$pce_db_collabrules = $wpdb->prefix . 'collabrules';
$pce_db_collabrules = 'wp_collabrules';

プラグイン専用のテーブルが作成されるわけですが、常にメインブログのテーブルを対象にするように修正します。wp-config.phpの$table_prefixの値です。

マルチサイト対応

先の編集内容を踏まえ、"メインブログ"上にてプラグインを"ネットワークで有効化"します。これで全てのブログで承認ワークフローが利用できます。

※WordPress3.0.3、Peter's Collaboration E-mails1.5.0で検証


488337730X
PHPによるWordPressカスタマイズブック―3.x対応

4839936072
基本からしっかりわかる WordPress 3カスタマイズブック (Web Designing Books)


【関連記事】
WordPress Ajaxで翻訳がうまくいかない原因と対処 - 130単位
WordPress 条件により翻訳テキスト切り替え - 130単位