当サイトはアフィリエイト広告を利用しています

WordPressをWiki風にするために行った設定や導入プラグイン・注意事項色々

2018-11-18Web制作

こんにちは、とみーです。

実は私、このブログ以外にもう1つサイトを持っています。高校時代に作成し絶賛放置中のサイトを。

経年劣化する内容ではないので資産として残してあるのですが…全ページHTMLで作成したため、管理がこの上なく大変でした。

有難いことに不足している情報を提供してくださる方が大勢いらっしゃったのですが、更新は自分しか出来ない。社会人となった自分は時間が取れない。

そんなわけでHTMLからWikiにしようと思ったのですが、日本で慣れ親しまれているPukiWikiは開発がほぼ停止している状態で、セキュリティ面が不安。

そこでWordPressのユーザー権限を利用して、Wiki風に仕上げようと思い立ったわけです。

 

「Wiki化」ではなく、あくまで「Wiki風」なのがポイント。

Wiki化ではないと個人的に考えるポイントは

  • 編集するのにログインが必要
  • 記法がMarkdownでない

大きくこの2つ。

2番目はプラグインを導入すればMarkdown記法にも対応可能ですが、WordPressのクラシックエディタがWordっぽくてとっつきやすいので、無理にMarkdown記法にする必要はないかな、と。

 

このページではWiki風にするために行った設定を紹介しています。ソースコードがあるものはfunctions.phpに追記すれば動作します。

もう1つのサイトはひっそりこっそりやっていきたいので、スクリーンショットはなしです。ごめんなさい。

テーマの選定…LuxeritasかCocoonがおすすめ

WordPressをWiki風にするわけですが、テーマはなんでもいいわけではありません。

個人的におすすめなのが、このブログでも使っているLuxeritas(ルクセリタス)。またはCocoon(コクーン)。どちらも無料で高性能なテーマです。

私はCocoonにしました。デフォルトで様々な装飾ボックスが搭載されており、利用者の方々にも分かりやすいと思ったので。

参考Luxeritas

参考Cocoon

ログイン画面のロゴとリンクURLを変更

自己満足なのでやってもやらなくても。

デフォルトではログイン画面はWordPressのロゴとWordPress.comへのリンクが貼られています。それを自サイト仕様に変更。

// ロゴの変更
function theme_login_style() { ?>
    <style>
        body.login div#login h1 a {
            background-image: url( "ロゴ画像URL" );
            background-size: contain;
            height: 60px;
            width: 100%;
        }
    </style>
<?php }
add_action( 'login_enqueue_scripts', 'theme_login_style' );

// リンクURLの変更
function theme_login_logo_url() { 
    return esc_url( home_url( '/' ) );
}
add_filter( 'login_headerurl', 'theme_login_logo_url' );

// title属性の変更
function theme_login_logo_url_title() {
    return get_bloginfo( 'name' );
}
add_filter( 'login_headertitle', 'theme_login_logo_url_title' );

参考WordPressのログイン画面のロゴ画像などスタイルを変更する方法

編集者ユーザーを追加

管理者以外に、編集者を追加しました。追加したユーザーは1つで、利用者で共有していただくことに。

参考WordPressのユーザーの種類と権限について

編集者の権限を制限

編集者でも、手を触れて欲しくないところはあります。

そんなわけで権限を縮小…もとい、メニューを表示させないようにします。

function remove_admin_setting_menus_editor_role(){
    if ( current_user_can( 'editor' )  ) {
		remove_submenu_page( 'edit.php', 'edit-tags.php?taxonomy=category' ); 	// カテゴリーを非表示
		remove_submenu_page( 'edit.php', 'edit-tags.php?taxonomy=post_tag' );	// タグを非表示
		remove_menu_page( 'link-manager.php' ); 								// リンクを非表示
		remove_menu_page( 'edit-comments.php' );								// コメントを非表示
		remove_menu_page( 'wpcf7' );											// コンタクトフォームを非表示
		remove_menu_page( 'profile.php' );										// プロフィール
		remove_menu_page( 'tools.php' );										// ツール
		remove_menu_page( 'gwolle-gb/gwolle-gb.php' );							// Guestbook
        // 上記コードで非表示になるがURLを知っていればアクセス可能なのでリダイレクトさせる
        global $pagenow;
        if( in_array( $pagenow, array(
			'link-manager.php',
			'comment.php',
			'edit-comments.php',
			'profile.php',
			'tools.php',
        ) ) )
        wp_redirect( 'index.php' );
		
		$request_uri = $_SERVER['REQUEST_URI'];
		if( $pagenow == 'edit-tags.php' ){
			//カテゴリー・タグの処理
			if( strpos($request_uri,'taxonomy=category') or strpos($request_uri,'taxonomy=post_tag') !== false ){
			   wp_redirect( 'index.php' );
			}
		}
		if( $pagenow == 'admin.php' ){
			//コンタクトフォーム・ゲストブックの処理
			if( strpos($request_uri,'page=wpcf7') or strpos($request_uri,'page=gwolle-gb') !== false ){
			   wp_redirect( 'index.php' );
			}
		}
	}
}
add_action( 'admin_menu', 'remove_admin_setting_menus_editor_role', 20 );

(URL直接入力でリダイレクトする部分のコード、多分もっとスマートな書き方があるはず…)

 

色々と制限しましたが、要は編集者は

  • 記事の新規投稿
  • 記事の編集
  • 他の人が書いた記事の編集

が可能な設定です。

参考WordPressで編集者の権限の変更

参考【WordPress】管理画面の条件分岐・判定(if文)【WP】

投稿画面で不要なボックスを非表示

投稿画面の、エディタの右側とか下側にある設定ボックス。必要最低限にして表示させないようにしました。

こちらのソースはCocoonの場合ですので、他テーマだとうまく動作しない可能性があります。

function remove_post_supports() {
    if ( current_user_can( 'editor' ) ) {
        remove_post_type_support( 'post', 'author' );            // 作成者
        remove_post_type_support( 'page', 'author' );            // 作成者
        remove_post_type_support( 'post', 'thumbnail' );        // アイキャッチ
        remove_post_type_support( 'page', 'thumbnail' );        // アイキャッチ
        remove_post_type_support( 'post', 'excerpt' );             // 抜粋
        remove_post_type_support( 'page', 'excerpt' );             // 抜粋
        remove_post_type_support( 'post', 'trackbacks' );         // トラックバック
        remove_post_type_support( 'page', 'trackbacks' );         // トラックバック
        remove_post_type_support( 'post', 'custom-fields' );     // カスタムフィールド
        remove_post_type_support( 'page', 'custom-fields' );     // カスタムフィールド
        remove_post_type_support( 'post', 'comments' );         // コメント
        remove_post_type_support( 'page', 'comments' );         // コメント
        remove_post_type_support( 'post', 'page-attributes' ); // ページ属性
        remove_post_type_support( 'page', 'page-attributes' ); // ページ属性
        remove_post_type_support( 'post', 'post-formats' );     // 投稿フォーマット
        remove_post_type_support( 'page', 'post-formats' );     // 投稿フォーマット
    }
}
add_action( 'init', 'remove_post_supports', 20 );

function remove_post_meta_boxes() {
    if ( current_user_can( 'editor' ) ) {
        remove_meta_box( 'slugdiv', 'post', 'normal' );                            // スラッグ
        remove_meta_box( 'slugdiv', 'page', 'normal' );                            // スラッグ
        remove_meta_box( 'commentstatusdiv', 'post' , 'normal' );        // ディスカッション
        remove_meta_box( 'commentstatusdiv', 'page' , 'normal' );        // ディスカッション
        remove_meta_box( 'singular_seo_settings', 'post', 'normal' );    // SEO設定
        remove_meta_box( 'singular_seo_settings', 'page', 'normal' );    // SEO設定
        remove_meta_box( 'custom_css', 'post', 'normal' );                    // カスタムCSS
        remove_meta_box( 'custom_css', 'page', 'normal' );                    // カスタムCSS
        remove_meta_box( 'custom_js', 'post', 'normal' );                    // カスタムJavaScript
        remove_meta_box( 'custom_js', 'page', 'normal' );                    // カスタムJavaScript
        remove_meta_box( 'singular_ad_settings', 'post', 'side' );            // 広告設定
        remove_meta_box( 'singular_ad_settings', 'page', 'side' );            // 広告設定
        remove_meta_box( 'singular_update_settings', 'post', 'side' );    // 更新日の変更
        remove_meta_box( 'singular_update_settings', 'page', 'side' );    // 更新日の変更
        remove_meta_box( 'singular_page_settings', 'post', 'side' );        // ページ設定
        remove_meta_box( 'singular_page_settings', 'page', 'side' );        // ページ設定
        remove_meta_box( 'singular_redirect_settings', 'post', 'side' );    // リダイレクト
        remove_meta_box( 'singular_redirect_settings', 'page', 'side' );    // リダイレクト
        remove_meta_box( 'singular_amp_settings', 'post', 'side' );            // AMP設定
        remove_meta_box( 'singular_amp_settings', 'page', 'side' );            // AMP設定
        remove_meta_box( 'singular_sns_image_settings', 'post', 'side' ); // SNS画像
        remove_meta_box( 'singular_sns_image_settings', 'page', 'side' ); // SNS画像
    }
}
add_action( 'admin_menu', 'remove_post_meta_boxes', 20 );

参考管理ページの投稿画面からいらない機能を削除する

編集画面の「更新日の変更」のデフォルト値を更新にする

投稿画面の不要なボックスを非表示にして、編集者には更新日をいじれないようにしました。

でも管理者はいじれます。更新日を通知しないこともできるんです。

管理者が更新日を通知しないようにこっそり更新すると、その設定が次の編集者にも受け継がれてしまいます。

なので管理者が通知しない設定で更新しても、チェックボックスが「更新する」に設定されるようにしました。

function editor_change_update_level(){
  ?>
    
  <?php
}
add_action('edit_form_after_editor','editor_change_update_level');

参考WordPress記事編集画面の「更新日の変更」のデフォルト値を変更する

編集ロックで編集の競合を防ぐ

編集者は2人以上の同時ログインが可能ですし、管理者と編集する記事がかぶってしまうことも想定されます。

WordPressでは2人以上が同時に同じ記事を編集できないようにするため、「編集を引き継ぐ」という機能があります。が、後から来た人が優先されるのはおかしな話。

前に来た人が優先されるよう、編集を引き継ぐボタンを非表示にします。

add_filter( 'override_post_lock', '__return_false' );

参考編集ロック機能で先に投稿画面に入ったユーザーを優先させる

削除できない(ゴミ箱に移動できない)ようにする

せっかく作成したページを勝手に削除されたら困るので、管理者以外は削除禁止にしました。

編集者の方で作成してしまった不要なページがある場合は、一旦下書きにして保存していただき、管理者に連絡する旨をどこかに書いておくことに。

//ゴミ箱に移動する直前に実行する
add_action( "wp_trash_post", "no_delete_page",1,1 );
function no_delete_page($post_id) {
    global $post_type;

    if ( !current_user_can( 'administrator' ) ) {
        if(!strpos(wp_get_referer(), 'notrash=1')){
            $no_trash_flag = '&notrash=1';
        }
        wp_redirect( wp_get_referer() . $no_trash_flag );
        exit();
    }
}
 
//エラーメッセージ表示処理
add_action('admin_notices', 'trash_notice');
function trash_notice(){
    //パラメータがある時にメッセージを表示
    if(strpos(getenv('REQUEST_URI'), 'notrash=1')){
        echo '<div class="message error"><p>選択されたページを削除することはできません。</p></div>';
    }
}

参考WordPressで特定記事などを削除禁止にする方法

メディアのアップロードをできないようにする

メディアのアップロードだけ禁止にして、ライブラリは見れるようにしたかったのですが…私のスキルでは無理っぽくて断念。メディア関係の権限を全て制限してます。

画像を多用するサイトではなかったので…まぁいいか、と。

function remove_theme_caps(){
    $role = get_role( 'editor' );
    $role->remove_cap( 'upload_files' );
}
add_action( 'admin_init', 'remove_theme_caps' );

参考WordPressのユーザーに権限を追加・削除する方法

特定の固定ページを編集できないようにする

プライバシーポリシー等、一部の固定ページは管理者以外編集できないようにしたかったのですが…まだ出来てません。どうやるの。

 

編集についてのページを作成

意外と重要なこの手順。編集方法とか注意書きとかを書いた固定ページを作成しました。

ログインページのリンクと共に、IDとパスワードも書いておきます。

Wiki風サイトのために導入したプラグイン

Wiki風にするために必要だったプラグイン

  • What’s New Generator

更新したページを通知するプラグインです。

「投稿画面で不要なボックスを非表示」で編集者は更新日をいじれないため、絶対的に更新が通知される仕様になってます。

大多数は良識ある方なのですが中にはそうでもない方もおり、悪意ある改変をされた場合いち早く発見できるように導入しました。

あと利用者の利便性向上。

 

  • Gwolle Guestbook

コメント欄を開放しているので何かあれば各ページに書き込んでいただければいいのですが、どのページにも属さないケースがあるためゲストブックを設置。

 

何かあったときのためのプラグイン

  • BackWPup

悪意ある改変をされた場合、リビジョンから復元すれば問題ありません。しかしあまりに多くのページを改変された場合は手におえず。What’s New Generatorも最大30ページまでしか通知してくれませんし。

データベースの情報だけ毎日バックアップしてます。

 

  • Simple Revisions Delete by bweb

リビジョンデータを個別に削除できるプラグインです。

編集者がこまめに保存すると、やたらリビジョンが増えます。不要なリビジョンは削除しないとデータベースが肥大化してサイトが遅くなることに。

リビジョンを一括削除できるプラグインは色々ありますが、残しておきたいリビジョンを選別できる(&WP6.1でも動作する)のがこれしかなかったので。

あとがき:手間はかかるけどWordPressをWiki風にすることは可能!

色々と設定は必要ですが、WordPressの利点を生かしてWiki風にすることができました。

Wiki風としましたが、メディアサイトを立ち上げる場合にも活用できるかと。

何かのお役に立てれば幸いです。

 

ちなみに、完全にWiki化するプラグインもありますが、開発停止してしまってるのでおすすめはしません。

参考WordPressをWiki化するプラグイン!不特定多数で攻略サイトを作成する方法!日本語化ファイル配布してます!

スポンサーリンク

おすすめ記事セレクション