web-dev-qa-db-ja.com

アップローダ画面で管理者以外のメディアライブラリタブを無効にする

フロントエンドユーザーがメディアをアップロードできるようにするために必要なプラグインを開発しています。しかし、私は彼らにアップローダスクリーンのタブとして来るメディアライブラリにこっそり入れさせたくありません。

私は以下を試しました

function remove_medialibrary_tab($tabs) {
    if ( !current_user_can( 'administrator' ) ) {
        unset($tabs['library']);
        return $tabs;
    }
    else
    {
        return $tabs;
    }
}
add_filter('media_upload_tabs','remove_medialibrary_tab');

しかし、このフィルタは廃止予定で、もう機能しないようです。

4
codepixlabs

この機能はアップロード画面にメディアライブラリタブを表示しません

   function remove_medialibrary_tab($strings) {
        if ( !current_user_can( 'administrator' ) ) {
            unset($strings["mediaLibraryTitle"]);
        return $strings;
        }
        else
        {
            return $strings;
        }
    }
    add_filter('media_view_strings','remove_medialibrary_tab');

私はメディアライブラリタブへの切り替えが実際にこのajaxアクション query-attachments を呼び出すことを発見しました。だから私は最優先でこのアクションに別のコールバック関数を追加しました、それはユーザーがadminでないかどうかチェックします、アクションはそこですぐに停止します。これは私のためのトリックをした:)

function restrict_non_Admins(){

        if(!current_user_can('administrator')){
            exit;
        }
    }

add_action('wp_ajax_query-attachments','restrict_non_Admins',1);
add_action('wp_ajax_nopriv_query-attachments','restrict_non_Admins',1);
7
codepixlabs

関数media_upload_tabs()は非推奨ではありません。それはthe_media_upload_tabs()によってのみ呼び出され(完璧な命名、私は知っています)、それもmedia_upload_header()..によって一度だけ呼び出されます。

編集 - プラグインを使ってフィルタをテストしたところ、それが動作していてアタッチされたコールバックのvar_dump( $tabs )がタブから出てきましたが、何もしません。その理由は、JavaScriptを使用して backbone および underscore templatesによって生成されているためです。すべてのテンプレートを担当するファイルは~/wp-includes/media-template.phpです。それまでの検索から、出力を変更するためのフィルタはありません。基本的にはwp_print_media_templates()という名前の1つの巨大なPHP関数がすべてのテンプレートをラップし、異なるテンプレートの前後にいくつかのアクションがあります。

wpオブジェクトをconsole.log()しようとしたところ、wp.media.view which と思われる ...を保持することがわかりました。 ~/wp-includes/js/media-modals.jsは、JavaScriptが生成したすべてのUIの根底にあるようです。深く掘り下げると、wp.templateに "underscore -extended"が入るwp.media.templateが見つかります。それから私は~/wp-includes/js/wp-util.jsへの参照を見つけました、そしてそれはそのJS関数のための引数が#idで始まるtmpl-であることを説明します。

カスタムコールバックを追加する_.memoize()のラッパーのみが計算結果を「保存」して「速度を上げる」ためのものになりました。その内容はRegex-esのほんの一部であり、それはcompiled()という名前の関数にプッシュされます。

_.template( $( '#tmpl-' + id ).html(), null, options )

.. OK。 ~/wp-includes/js/media-views.js~/wp-includes/js/media-models.jsからのものも関係しています、そして私がもうBackboneについて何も近くに知らないので、私はそこから進む方法の手がかりを得ませんでした。私は私のデバッグ用プラグインをこの答えと他の人々への出発点としてここに置いておきます。

<?php
defined( 'ABSPATH' ) or exit;
/**
 * Plugin Name: (#125669) Media Upload Tabs by role
 * Description: Removes media upload tabs on a by-role base.
 */

add_action( 'admin_footer', 'wpse125669MediaUploadTabsRemove', 0 );
function wpse125669MediaUploadTabsRemove()
{
    if ( "edit.php" !== get_current_screen()->parent_file )
        return;

    ?>
<script type="text/javascript">
console.log( wp.media );
</script>
    <?php
}
2
kaiser