XO Event Calendar のイベントの編集に独自の権限を設定

WordPress プラグイン『XO Event Calendar』で、イベントの編集に独自の権限を設定する方法を紹介します。

デフォルトは、投稿(post)と同じ権限となります。

イベントはカスタム投稿タイプを使用しています。このカスタム投稿タイプを作成する際の引数を変更するための “xo_event_calendar_register_post_args” フィルターがあります。

フィルターの使い方

“xo_event_calendar_register_post_args” フィルターが呼び出されると、1つの引数が渡されます。この引数は、register_post_type 関数の $args パラメーターです。

function my_event_calendar_register_post_args( $args ) {
    // $args を変更する処理
    return $args;
}
add_filter( 'xo_event_calendar_register_post_args', 'my_event_calendar_register_post_args' );

独自の権限を設定するサンプル

$args の capability_type、capabilities、 map_meta_cap を設定することにより、独自の権限を設定します。

function my_event_calendar_register_post_args( $args ) {
	$capabilities = array(
        // 自分のイベントを編集する権限
        'edit_posts' => 'edit_events',
        // 他のユーザーのイベントを編集する権限
        'edit_others_posts' => 'edit_others_events',
        // 公開済みのイベントを編集する権限
        'edit_published_posts' => 'edit_published_events',
        // イベントを公開する権限
        'publish_posts' => 'publish_events',
        // 自分のイベントを削除する権限
        'delete_posts' => 'delete_events',
        // 他ユーザーのイベントを削除する権限
        'delete_others_posts' => 'delete_others_events',
        // 公開済みイベントを削除する権限
        'delete_published_posts' => 'delete_published_events',
        // プライベートのイベントを削除する権限
        'delete_private_posts' => 'delete_private_events',
        // プライベートのイベントを編集する権限
        'edit_private_posts' => 'edit_private_events',
        // プライベートのイベント投稿を閲覧する権限
        'read_private_posts' => 'read_private_events',
    );

    $args['capability_type'] = 'event';
    $args['capabilities'] = $capabilities;
    $args['map_meta_cap'] = true;

    // 管理者に独自権限を付与します。
    $role = get_role( 'administrator' );
    $role->add_cap( 'edit_events', 'edit_others_events', 'edit_published_events', 'publish_events', 'delete_events', 'delete_others_events', 'delete_published_events', 'delete_private_events', 'edit_private_events', 'read_private_events' );

    // 編集者に独自権限を付与します。
    $role = get_role( 'editor' );
    $role->add_cap( 'edit_events', 'edit_others_events', 'edit_published_events', 'publish_events', 'delete_events', 'delete_others_events', 'delete_published_events', 'delete_private_events', 'edit_private_events', 'read_private_events' );

    // 投稿者に独自権限を付与します。
    $role = get_role( 'author' );
    $role->add_cap( 'edit_events', 'edit_published_events', 'publish_events', 'delete_events', 'delete_published_events' );

    // 寄稿者に独自権限を付与します。
    $role = get_role( 'contributor' );
    $role->add_cap( 'edit_events', 'delete_events' );

    return $args;
}

add_filter( 'xo_event_calendar_register_post_args', 'my_event_calendar_register_post_args' );

コードを解説しようと思ったけどちょっとややこしいので、コード内のコメントを参照してください。

コメント

  • ご教授ありがとうございます。
    先ほど、編集者モードでログインしたところ、普通に使えるようです。ですので、私のサイトでは、無理にコードの修正をしなくても運用上問題なく使えることが分かりました。
    投稿者モードなど、それ以外のモードも含めて細かい権限の設定をしたい方は必要な機能かもしれませんが、設定が増えると使い勝手が悪くなりますので、先の要望は撤回し、このままでOKとさせて頂きます。
    どうもお手数をお掛けしました。

    • 問題ないということでよかったです。
      今後も何かありましたら気軽にコメントしてください。

      • 補足ですが、折角良いプラグインを作られたのですから、海外の方にもっと使って頂けるよう、以下URLのWordPress.orgのPlugin Directoryにおいて、xo-event-calendarのDescriptionのプラグイン説明で、ショーコードも使える旨、その使用法(英文)も追記されると良いかと思います。
        シンプルな使い勝手で、お店の営業用カレンダー(Biz Use)にも適し、イベント表示も可能なところも売りだと思います。
        現状の説明文だと何もできないプラグインに見えてしまいとても残念です。
        確か、以前このディレクトリで、キーワード「Calendar」で何度か検索しましたが、このプラグインの説明文を見てスキップした記憶があります。
        私はその他、同様のプラグインで日本のWP-BizPlugin制作のBiz Calendarも他のサイトで使っていますが、これはウィジェットのみの対応でイベント機能も1イベントのみなので、機能的には今一つなプラグインです。XO Event Calendarの方がはるかに優れています。

        https://wordpress.org/plugins/xo-event-calendar/

        • 改めてプラグインの説明を見てみると、たしかに説明不足はいなめないですね。
          書いたときは十分だとおもっていたのですが、なかなか自分では気づかないものなんですね。
          次回のバージョンアップ時に、改めたいとおもいます。

  • お世話になっております。
    ひとつ質問をよろしいでしょうか。

    スケジュールの件名をカレンダーに表示させるときに、改行をさせてタイトルを全部表示させたいと思っているのですが

    xo-event-calendar.css の43行目

    overflow部分を「word-break: break-all;」に変えたらうまくいくのかな。。。
    と思っていたのですが、どうも改行ができないのです。
    というのもスマホで見たときに件名が全部わかるようにしたいのです。
    「overflow:scroll;」
    にしてしまうとスマホではスクロールしにくいのでうーん。。。と思っているのですが、こちらはそういう風にはできない仕様になっているのでしょうか?
    初歩的な質問で大変申し訳ありませんが、もしご教授いただけるのでしたら嬉しいです。

    このプラグインはWordpressのカレンダーで全部(716個)インストールして検証して一番使い勝手が良かったです。
    素晴らしいプラグインをありがとうございます。

    • カスタマイズ関連(特にカレンダーの HTML 構成は入り組んでいるので)のドキュメントを作成しないといけないなとは思ってはいたのですが・・・分かり難くくてすみません。
      タイトルは、スタイルで改行しない(white-space: nowrap;)ようにしています。改行するには下記を style.css 等に記述してみてください。
      .xo-event-calendar table.xo-month .month-event-title {
      white-space: normal;
      }
      質問大歓迎です。どしどし質問してください。

      • 石鷹様
        お世話になっております、海原です。

        またわからない事が出てきてしまったのでご質問よろしいでしょうか。

        件名を改行させて全部を表示させることができたのですが
        今度はスマホで見たときに改行しまくってしまって
        1スペースの中の文字がやたら縦長になってしまっています。

        そこで、このカレンダーの中の文字だけ
        画像をそのまま縮小したように文字も小さくできたらと思っているのですが

        これはブレイクポイントをつけて段階的に%でfontを縮小、または小さいサイズを指定すれば解決するのかな?
        と想像しているのですが
        この設定の部分は

        xo-event-calendar.css

        .xo-event-calendar table { table-layout: fixed; border-collapse: separate; border-spacing: 0; margin: 0; padding: 0; width: 100%; background-color: #fff; color: #333; }

        の部分をいじればいいのか
        それとも別にCSSに命令文を追加すればいいのでしょうか?

        スマホだけフォントを小さくしたい場合

        @media screen and (max-width:640px){
        body {
        font-size:6px;
        }
        }

        という感じのものを入れるのか?
        と思っているのですが、どこに入れていいのかがちょっと迷子になっていまして。。。

        イメージでいうと

        http://necomesi.jp/staff/shimada/responsive-table/

        こういう感じにしたいのです。
        ※他人様のサンプルページを拝借しました。

        実際には3倍までの「ピンチイン」を設定しようと思うのでそれで拡大してもらい
        通常は全体のイメージをスッキリと見せたいのです。

        もしよろしければご教授願えないでしょうか。
        よろしくお願いいたします。

        • こんにちは
          スクリーンの幅によってスタイルを切り替えればいいとおもいます。
          /* 641px 以上 */
          .xo-event-calendar table.xo-month .month-event-title {
          font-size: 0.8em;
          }
          /* 640px 以下 */
          @media screen and (max-width: 640px) {
          .xo-event-calendar table.xo-month .month-event-title {
          font-size: 0.65em;
          }
          }
          ちなみに、スタイルで行数を制限することもできます。
          .xo-event-calendar table.xo-month .month-event-title {
          position: relative;
          word-wrap: break-word;
          overflow: hidden;
          text-overflow: ellipsis;
          display: -webkit-box;
          -webkit-line-clamp: 5; /* 最大行数 */
          -webkit-box-orient: vertical;
          }
          なお、スタイルの変更は xo-event-calendar.css ではなく、テーマの style.css 等で行ってください。xo-event-calendar.css はプラグインの更新時に上書きされてしまい変更が消えてしまいます。

          • 石鷹様
            ご教授ありがとうございます。

            文字のサイズ変更が反映されました。
            ただ、ピンチアウトする前提で表示をもっと小さくしたかったのですが
            ブラウザの設定で最小が10pxみたいなのです。
            そのときに、このページ(http://on-ze.com/archives/3674)を参考にして限界を超えた小さなサイズにしたく、

            /* 640px 以下 */
            @media screen and (max-width: 640px) {
            .xo-event-calendar table.xo-month .month-event-title {
            font-size: 0.65em;
            }
            }

            /* 640px 以下 */
            @media screen and (max-width: 640px) {
            .xo-event-calendar table.xo-month .month-event-title {
            font-size:10px
            -webkit-transform:scale(0.5);
            -moz-transform:scale(0.5);
            -ms-transform:scale(0.5);
            -o-transform:scale(0.5);
            transform:scale(0.5);
            }
            }

            にすればより小さくなるのかなと思っていたのですが、、、
            どうもこれはうまく反映されないようで、この記述に足りない命令文があるのか、それともそもそも反映は難しいのでしょうか?

            何度もわがままを申して申し訳ありません。
            もし、よろしければお時間があるときにご教授いただけたら幸いです。
            よろしくお願いいたします。

          • > ブラウザの設定で最小が10pxみたいなのです。
            そうだったんですね、知らなかったです。
            反映されないのは、セミコロン(;)が抜けているからではないでしょうか?(転記ミス?)
            @media screen and (max-width: 640px) {
            .xo-event-calendar table.xo-month .month-event-title {
            font-size:10px; /* ここ */
            -webkit-transform:scale(0.5);
            -moz-transform:scale(0.5);
            -ms-transform:scale(0.5);
            -o-transform:scale(0.5);
            transform:scale(0.5);
            }
            }
            でも、この方法だと領域も縮小してしまいますね。
            他の方法はちょっと思いつきません。m(__)m

  • 石鷹様、ご教授ありがとうございます。

    教えて頂いた内容を実行してみましたら反映されました。
    ありがとうございます。
    また何かありましたら質問をさせていただきたいと思います。
    拡散、宣伝もさせていただきます。
    よろしくお願いいたします。

  • 石鷹様
    早速ご質問ができてしまったのですが、、、よろしいでしょうか。
    カレンダーの件名文字色と件名の背景を変更したいと思って
    これまたCSS43行目に「color: #000;」を指定すればいいのかな。。。
    と思ったのですが違う感じなのですよね?
    http://affiliate-time.com/archives/1174
    ※こちらのページで検証をしております。
    リンク文字をテーマ全体で青系にしているのですが、下線部だけが青で文字自体の色が変更されないのです。
    どの部分で文字の色、背景のボックス色を変えればいいのかご教授願えないでしょうか。
    よろしくお願いいたします。

    • カレンダーの件名の文字色と背景色だけは style 属性で記述しているため、テーマの style.css より優先されてしまいます。
      よって style.css で上書きする場合は、!important を指定して最優先させる必要があります。
      .xo-event-calendar table.xo-month .month-event-title {
      white-space: normal;
      color: #0000ff !important;
      background-color: #cccccc !important;
      }
      拡散、宣伝ありがとうございます。:)

  • 石鷹様、ご教授ありがとうございます。
    こちらの方法で設定をさせていただきましたら見事に反映をすることができました。
    ありがとうございます。

    それで何回も質問申し訳ありません。
    カレンダーの件名から本文に入ったときに、メイン本文の一番下に
    「PREV」と「NEXT」があるのですが、この表示位置を変える場合は
    main.phpの一番最後の

    function single_content( $content ) {

    の部分をいじればいいのかなと思っているのですが

    それか
    admin.php

    * イベント カスタム投稿タイプのメッセージを変更します。
    */
    function post_updated_messages( $messages )
    の部分なのか。。。

    考えている表示方法としては
    一番上のカテゴリーの部分に
    「PREV」と「NEXT」をそのまま持ってくるか

    「<前の記事」「次の記事>」みたいな表示ができないかなぁ。。。

    と考えています。

    何度もわがままを申して申し訳ありません。
    もし、よろしければお時間があるときにご教授いただけたら幸いです。
    よろしくお願いいたします。

    • イベントの表示は、デフォルトではテーマの single.php を使用しています。
      「PREV」と「NEXT」は、この single.php が表示しています。
      表示をカスタマイズする場合は、この single.php を編集するか、single.php をコピーして single-xo_event.php という名前で保存し編集することになります。
      テーマによって single.php のコードは様々なのであとはコードを追ってみてください。

  • 石鷹様、ご教授ありがとうございます。
    理解することができました。
    テーマのsingle.phpだったのですね。
    ありがとうございます。

  • こんにちは
    大変便利なプラグインの提供ありがとうございます。
    一点質問なのですが、カレンダーに表示されるイベントのタイトルをカテゴリー名にしたいのですが、可能でしょうか。
    既出でしたら申し訳ございません。
    ご教示の程よろしくお願いいたします。

    • はじめまして、こんにちは。
      下記のようなコードで変更することができます。
      テーマの functions.php などに、

      function my_xo_event_calendar_events( $events, $args, $month_index ) {
      	foreach( $events as $key => $value ) {
      		$terms = get_the_terms( $value['post']->ID, 'xo_event_cat' );
      		if ( $terms ) {
      			//$events[$key]['title'] = $terms[0]->name;
      			$events[$key]['short_title'] = $terms[0]->name;
      		}
      	}
      	return $events;
      }
      add_filter( 'xo_event_calendar_events', 'my_xo_event_calendar_events', 10, 3 );
      • 石鷹さま
        早速のご回答ありがとうございます!
        反映されました!

石鷹 へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。

日本語でコメントを入力してください。(スパム対策)