web-dev-qa-db-ja.com

post_mime_typesフィルタがリストモードで機能しない

メディアライブラリに新しい並べ替えオプションを追加するには、次のコードを使用します。

function modify_post_mime_types( $post_mime_types ) {

    $post_mime_types['application/pdf'] = array( __( 'PDFs' ), __( 'Manage PDFs' ), _n_noop( 'PDF <span class="count">(%s)</span>', 'PDFs <span class="count">(%s)</span>' ) );
    $post_mime_types['application/vnd.openxmlformats-officedocument.presentationml.presentation'] = array( __( 'Powerpoints' ), __( 'Manage Powerpoints' ), _n_noop( 'Powerpoints <span class="count">(%s)</span>', 'Powerpoints <span class="count">(%s)</span>' ) );
    $post_mime_types['application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document'] = array( __( 'Documents' ), __( 'Manage Documents' ), _n_noop( 'Documents <span class="count">(%s)</span>', 'Documents <span class="count">(%s)</span>' ) );

    return $post_mime_types;

}

add_filter( 'post_mime_types', 'modify_post_mime_types' );

これは、JavaScript対応の「グリッド」モードに最適です。

PDFs Grid

しかし、 "リスト"モードでは、エントリをクリックするとすべての拡張子/ファイルが表示されます(正しく表示されていても)。

PDFs List

これがPDFのリダイレクト先のURLです。

wp-admin/upload.php?mode = list&attachment-filter = post_mime_type%3Aアプリケーション%252Fpdf&m = 0&filter_action =フィルタ&アクション= -1&paged = 1&action2 = -1&影響あり&_ajax_nonce = 093720f202&ps

私が標準のWordpressの "Images"フィルタを使ってみると、実際にうまくいく。そのためのURLは次のとおりです。

wp-admin/upload.php?mode = list&attachment-filter = post_mime_type%3 image&m = 0&filter_action =フィルタ&action = -1&paged = 1&action2 = -1&影響を受ける&_ajax_nonce = 093720f202&ps

私はこれはおそらくWordpressのバグだと思っていますが、誰かがここで何かを知っているかどうかを確かめるだけです。

5
Drath

問題はattachment-filter= URLパラメータにあります。 application/pdf(またはelse)の間のスラッシュは2回エスケープされています。 %252Fをスラッシュまたは%2Fに置き換えると、フィルタは機能します。

最初のエスケープ(/%2Fになる)は、WPがMIMEタイプを含む選択ボックスを構築しているときに起こります。 2番目のもの(%2F%252Fになる)はブラウザによって実行されます。

最も簡単な解決策は、PHPのどこかにURLパラメータを手動でurldecodeすることです。

if ( isset( $_GET['attachment-filter'] ) )
    $_GET['attachment-filter'] = urldecode($_GET['attachment-filter']);

更新:その問題に関するWPコアチケットがあります: https://core.trac.wordpress.org/ticket/30123

これが修正されると、上記の答えは時代遅れになります。

1
Jörn Lund