質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.23%

Wordpressのメディアアップローダーでattachmentではないカスタム投稿タイプを扱う

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 237

xiki110

score 5

知りたいこと

Wordpressに標準搭載されていて、JSからwp.media()を用いると呼び出せるメディアアップローダーから、既存のメディア(post_type = attachment)ではない、カスタム投稿タイプを扱う方法について。

具体的には、

  1. 既存のattachmentと同様で、post_typeのみ変更したカスタム投稿タイプを作成する
  2. そのカスタム投稿タイプをメディアアップローダーで開く
  3. メディアアップローダーからそのカスタム投稿タイプで保存する

の3点を実現しようとしています。

1.に関しては特に苦労せず実装できそうなのですが、2.と3.に関しては全く歯が立ちません。

ソースコードレベルの話でも構いませんので、なにかご教授願えればと思います。

経緯

現在、Wordpressを利用してサイトを作成しているのですが、その際

  • ユーザーを管理者と寄稿者を分ける
  • 管理者はすべての投稿タイプを自由に弄れる
  • 寄稿者は一部の限定された投稿タイプのみ弄れる

という状態にしたいと考えています。

しかし、メディア関連の権限はupload_filesただひとつなので、寄稿者は「メディアをすべて弄れる」あるいは「メディアを全く弄れない」という2択の状況しか実現できませんでした。

そこで、デフォルトのメディア(post_type='attachment')と同様のカスタム投稿タイプ(例として'attachment_b')を作り、

  • 管理者はattachmentもattachment_bも自由に弄れる
  • 寄稿者はattachment_bのみ弄れる

という状態にすることで解決しようと考えましたが、結局、メディアアップローダーでattachment以外の投稿タイプを扱う方法が見つからず、躓いてしまいました。

wp.media()の引数を弄ればどうにかなるかと考えていましたが、自力で調べてもどうにもそれらしい情報を見つけることが出来ませんでした。

補足

質への直接の回答ではなく、

  • メディアアップローダーのattachment取得及び保存のソースコードの場所
  • はじめの条件を達成するためのそもそも全く別のアプローチ

でも構いませんので、どなたかお力添えいただけれ思います。

ちなみに、wp.media()のソースとしてmedia-model.jsは一通り読みましたが、どうやらデータベースからの情報取得と書き込みはそこでは行っていなさそうでした。

追記依頼へ

ご意見ありがとうございます。
CHERRY様のおっしゃる方向からのアプローチをもう一度考えてみました。
アクションフックに引っ掛けて、手動でattachmentに関わる権限の名前を書き換えることで、自分の作成したメディアだけを編集できるようにすることが出来ました。
また、その際、他の投稿タイプと違い、編集不能なものも管理画面から見えてしまう問題がありましたが、こちらはpre_get_postsに引っ掛けて作成者をそのユーザーに限定することで対処できました。
しかし、一括削除等の場合を考えると今ひとつ不便さが残りますので、もうしばらく回答を募集させていただきたいと思います。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • CHERRY

    2019/02/10 18:53

    新しくメディア用の投稿タイプを作成したいという質問のようですが、管理者と編集者いがいは自分の作成したメディア投稿だけを表示できるという内容ではダメなのでしょうか?

    キャンセル

  • xiki110

    2019/02/10 19:03

    ご意見ありがとうございます。

    それでも構いません。
    むしろ最初はその方向で考えておりました。
    しかし、メディア関連の権限がupload_files一つしかなかったため、「自分の作成したメディア投稿だけを表示できる」ということをどのように実装したらよいか思いつきませんでした。
    解決策がありましたら、ご教授願えればと思います。

    キャンセル

回答 1

checkベストアンサー

+1

遅くなってしましましたが、こんな感じの HOOK を追加するとどうでしょうか?

ソースコードを眺めた感じでは、質問に記載されているメディア用にカスタム投稿タイプを用意するのは、Wordpress 本体のコードにかなり手を入れないと無理と思うので...

代替手段として、「管理者以外は、自分の投稿したメディアだけが表示され、他人のメディアは見れない」を実現する方法です。

function display_self_upload_media_only( $query ) {
    $user = wp_get_current_user();
    if ( $user && ! current_user_can( 'administrator' ) ) {
        $query['author'] = $user->ID;
    }
    return $query;
}
add_action( 'ajax_query_attachments_args', 'display_self_upload_media_only' );

一応補足...
HOOKの中で、投稿者パラメータ を利用して、ログインユーザーだけの投稿に絞り込んでいますので、メディア詳細の URL (例: http://example.com/wp-admin/upload.php?item=100 ) をコピーして、メディアの投稿ID(URL の 100の部分)を他人のメディアIDに無理やり書き換えても表示されないと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/19 19:23

    ありがとうございます。
    やはり、メディアップローダー自体はattachmentとかなり深く紐付けられているんですね。
    頂いた回答を「表示直前の段階でフィルターフックからクエリをいじってあげれば良い」という意味で捉えてどうにか欲しい機能を実装することが出来ました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる