web-dev-qa-db-ja.com

カテゴリメタボックスを添付ファイルに追加できますか?

register_taxonomy_for_object_type()を使用して、カテゴリの分類項目をメディアのアップロード(添付ファイル)に追加しています。私はこのコードを使っています。

add_action('init', 'reg_tax');
function reg_tax() {
   register_taxonomy_for_object_type('category', 'attachment');
}

これは機能し、画像を閲覧するときにカテゴリのための単純なテキストフィールドをメディアページに追加します。私が本当に欲しいのは、実際のCategories Metaboxを表示するようにして、単純なフィールドにそれらをタイプするだけではなく、使用したいCategoriesを選択できるようにすることです。また、my-category-nameのようなこのテキストフィールドにカテゴリのスラッグを入れると、保存時にMy Category Nameのような実際のカテゴリ名として表示されるため、単純なテキストフィールドはさらに便利ではありません。

私はMetaboxを追加するためのadd_post_type_support()関数を見てきましたが、それがカスタム投稿タイプに使用されているのを見てきました。

18
Rick Curran

編集:12/09/2017これに対する最新の解決策については、この回答を参照してください。 新しいメディアライブラリの添付ファイルに分類法を使用する方法

私がやろうとしていたことに対する解決策を見つけ出すことができたので、私はここで私自身の質問に答えるつもりです。カテゴリメタボックスを添付ファイルに対して有効にすることはできませんでした。ただし、register_taxonomy_for_object_typeadd_post_type_supportを使用して、カテゴリの基本フィールドを添付ファイルページに追加するのは簡単なことがわかりました。

add_action('admin_init', 'reg_tax');
function reg_tax() {
   register_taxonomy_for_object_type('category', 'attachment');
   add_post_type_support('attachment', 'category');
}

追加されたフィールドは次のようになりました。

alt text

これは単なるプレーンテキストフィールドですが、そこに既存のカテゴリの名前を入力すると、添付ファイルが更新されたときに正常に保存されることがわかりました。保存後のナメクジ).

このようにしてカテゴリを保存できることに気付いたら、利用可能なすべてのカテゴリのリストをチェックボックスとして取得し、選択されているものを確認できることを考えました。私はそれからjQueryを使ってチェックされたカテゴリの値を取得し、すべてのカテゴリのスラッグをCategoryフィールドに入れました。これをさらにシームレスに見せるために、次にCategoryフィールドを含むテーブル行を非表示にするために単純なCSSを使用しました。

alt text

画像の添付ファイルにカテゴリを追加できるようになったので、次のように使用できます。

get_posts('post_type=attachment&category_name=timber-fixed-windows')

そして、分類された画像をページにまとめます。まさに私がしたいと思っていたこと、それをする方法があるとは思っていませんでしたが、うまくいくことができてよかったです。

私はこれをWOS Media Categoriesと呼ばれるプラグインに変えました。これは 私のウェブサイト、Suburbia.org.uk からダウンロードできるようにしました。これを理解するのに役立った私がここで尋ねた、そして他の質問についてコメントしてくれた人々に再び感謝します!

更新:Flashの一括アップローダを使用して画像をアップロードしている間にカテゴリを追加できるように修正を加えました。

13
Rick Curran

これを作成したばかりです。これは、フォームフィールドへのherky-jerk javascriptリンケージに対する完全な回避策です。チェックボックスの値は送信時に$ _POSTと一緒に渡されるので、add_image_attachment_fields_to_saveフィルタの間にそれらをつかみ、投稿オブジェクトの用語を設定することができます。

function register_custom_taxonomies() {
    $labels = array(
        'name' => _x( 'Image Formats', 'taxonomy general name' ),
        'singular_name' => _x( 'Image Format', 'taxonomy singular name' ),
        'search_items' =>  __( 'Search Formats' ),
        'all_items' => __( 'All Formats' ),
        'parent_item' => __( 'Parent Format' ),
        'parent_item_colon' => __( 'Parent Format:' ),
        'edit_item' => __( 'Edit Format' ), 
        'update_item' => __( 'Update Format' ),
        'add_new_item' => __( 'Add New Format' ),
        'new_item_name' => __( 'New Format Name' ),
        'menu_name' => __( 'Image Format' )
    );
    $capabilities = array(
        'manage_terms' => 'nobody',
        'edit_terms' => 'nobody',
        'delete_terms' => 'nobody'
    );
    $args = array(
        'public' => false,
        'hierarchical' => true,
        'labels' => $labels,
        'capabilities' => $capabilities,
        'show_ui' => false,
        'query_var' => 'image-format',
        'rewrite' => false
    );
    register_taxonomy('image-format', array('attachment'), $args);
}
add_action( 'init', 'register_custom_taxonomies', 1);

function add_media_categories($fields, $post) {
    $categories = get_categories(array('taxonomy' => 'image-format', 'hide_empty' => 0));
    $post_categories = wp_get_object_terms($post->ID, 'image-format', array('fields' => 'ids'));
    $all_cats .= '<ul id="media-categories-list" style="width:500px;">'; 
    foreach ($categories as $category) {
        if (in_array($category->term_id, $post_categories)) {
            $checked = ' checked="checked"';
        } else {
            $checked = '';  
        }
        $option = '<li style="width:240px;float:left;"><input type="checkbox" value="'.$category->category_nicename.'" id="'.$post->ID.'-'.$category->category_nicename.'" name="'.$post->ID.'-'.$category->category_nicename.'"'.$checked.'> ';
        $option .= '<label for="'.$post->ID.'-'.$category->category_nicename.'">'.$category->cat_name.'</label>';
        $option .= '</li>';
        $all_cats .= $option;
    }
    $all_cats .= '</ul>';

    $categories = array('all_categories' => array (
            'label' => __('Image Formats'),
            'input' => 'html',
            'html' => $all_cats
    ));
    return array_merge($fields, $categories);
}
add_filter('attachment_fields_to_edit', 'add_media_categories', null, 2);

function add_image_attachment_fields_to_save($post, $attachment) {
    $categories = get_categories(array('taxonomy' => 'image-format', 'hide_empty' => 0));
    $terms = array();
    foreach($categories as $category) {
        if (isset($_POST[$post['ID'].'-'.$category->category_nicename])) {
            $terms[] = $_POST[$post['ID'].'-'.$category->category_nicename];        
        }
    }
    wp_set_object_terms( $post['ID'], $terms, 'image-format' );
    return $post;
}
add_filter('attachment_fields_to_save', 'add_image_attachment_fields_to_save', null , 2);

(カテゴリではなくカスタム分類法を使用しているので、チェックボックスを設定するときに使用したのと同じ配列に一致するように$ categories配列を変更する必要があります)。

Shabam、shabozzle。楽しい。

4
Drew Gourley

出発点として@ RickCurranのWOS Media Categoriesを使用してプラグインを作成しました。しかし、WOSメディアカテゴリは、メディアにカテゴリサポートを追加する他のプラグインのように、実際にはメタボックスを追加しません。

overall view

それは必然的に投稿やページのメタボックスを単純化した形になりますが、私はそれを使いやすくするフィルタリング機能を含めました。

filterable categories

私は実際にあなたがページと投稿で見るカテゴリーメタボックス全体を生成しています、しかしスタイルの欠如と行方不明のjavascriptの両方のためにメディアページで働かないビットを隠しています。

メタボックスを完全に機能させる方法についての誰かが持っているかもしれないどんな考えでも歓迎します - 私がそれ以降のバージョンでやろうとしていること。

1
eddiemoya

あなたがWordPressのデフォルトのカテゴリボックスを使いたい場合、これは困難/複雑です。一つには、メタボックスは出力を返さず、ただそれをエコーするだけです。それに加えて、それはあなたに正しい入力フィールド名を与えないでしょう、それでそれは保存しないでしょう。 1つのアイデアは、 jQuery UI Autocomplete を使用してタグボックスの機能を複製することです。

ただし、メディアエディタのフィールドで遊びたい場合は、'attachment_fields_to_edit'にフックしてフィールドの配列を編集できます。フィルタは2つの引数をコールバックに渡します。最初の引数はフィールドの配列、2番目は添付ファイルのpostオブジェクトです。詳細はこちらをご覧ください。

http://phpxref.ftwr.co.uk/wordpress/nav.html?wp-admin/includes/media.php.source.html#l1025

1
John P Bloch

素晴らしいプラグインリック - とても役に立ちました。

Onclickトリガをonloadにバインドするのではなくインラインで動かす(およびその他のいくつかの微調整を加える)と、Flashバルクアップローダでも動作します。現在のバージョンでは、FlashはjQueryのloadイベントの後にロードされるため、オブジェクトはまだ存在しません。

改訂js:

 function wos_category_click(cat){
    var container = jQuery(cat).closest("tbody");
    var cat_checked = jQuery(container).find("tr.all_categories input:checked");
    var cat_arr = jQuery(cat_checked).map(function() {
        return jQuery(this).val();
    }).get().join();
    jQuery(container).find("tr.category > td.field > input.text").val(cat_arr);
}

phpファイルの入力にonclickを追加します。

<input type="checkbox" onclick="wos_category_click(this)" class="wos-categories-cb"....

cSSファイルに一括アップロードフォームIDを追加します。

form#media-single-form tr.category,form#file-form tr.category {
display:none; 

}

0
djbokka