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


18

register_taxonomy_for_object_type()カテゴリの分類フィールドをメディアのアップロード(添付ファイル)に追加するために使用しています。そのためにこのコードを使用しています:

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

これは機能し、画像を表示するときに、カテゴリの単純なテキストフィールドをメディアページに追加します。本当に必要なのは、プレーンフィールドに入力するだけでなく、使用するカテゴリを選択できるように、実際のカテゴリメタボックスを表示することです。また、カテゴリのスラッグをこのテキストフィールドに入れると、保存時のmy-category-nameようMy Category Nameに実際のカテゴリ名として表示されるため、単純なテキストフィールドの有用性が低くなります。

私はadd_post_type_support()メタボックスを追加するための関数を見てきましたが、それがカスタム投稿タイプに使用されるのを見てきましたが、添付ファイルにも同じものを追加できるかどうかわかりません。


ベストアンサーを選ぶ前に1〜2日待つ場合、プラグインを作成します...(今夜、クライアントの締め切り WordPressアンサーを使用してWordPressアンサーを提示します...)
MikeSchinkel

@マイク:ありがとう、私はこの問題にどんな解決策があるのか​​を知りたいです。私が望んでいるのは、WordPressの約90%が現状のままであるように思えますが、最後の10%についてはまだ見逃せません!
リックカラン

カスタム投稿メタボックスで非常に似たようなことをしました。すなわち、(基本的な)カテゴリリストを埋め込む(つまり、すべて/最も人気のあるタブなし)。それは、 'attachment_fields_to_edit'がそのPOSTをどのように実装するかに依存します。とにかく、今夜はできません。睡眠が必要です。
MikeSchinkel

おっと、あなたはすでに自分で答えているので、私はやることリストを外します。
MikeSchinkel

@マイク:あなたの助けをありがとう、私の解決策についてのフィードバックをお願いします。私はそれを機能させる方法を見つけてうれしいです。実際のカテゴリメタボックスを介して添付ファイルにカテゴリを追加するのは素晴らしいことですが、私のソリューションは十分に機能します。
リックカラン

回答:


14

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

私がやろうとしていることの解決策を見つけることができたので、ここで自分の質問に答えます。添付ファイルに対してカテゴリメタボックスを有効にすることは不可能であるという結論に達しました。ただし、register_taxonomy_for_object_typeand を使用して添付ページに追加されたカテゴリの基本フィールドを取得するのは簡単であることがわかりましたadd_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');
}

追加されたフィールドは次のように表示されます。

代替テキスト

それは単なるテキストフィールドですが、私が見つけたのは、そこに既存のカテゴリの名前を入力することができ、添付ファイルが更新されたときに正常に保存されることです(唯一の奇妙な動作は、保存後のスラッグ)。

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

代替テキスト

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

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

そして、分類された画像をページに引き込みます!まさに私が望んでいたことで、それを行う方法があるとは思わなかったが、なんとか解決できて良かった。

これをプラグインに変えました。これを私のウェブサイトSuburbia.org.ukWOS Media Categoriesからダウンロードできるようにしたので、他の人に役立つかもしれません!これについてコメントしてくれた人たちと、私がここで尋ねた他の質問に感謝します。

更新:Flashバルクアップローダーを使用して画像をアップロードしながら、カテゴリを追加できるようにする修正を追加しました。


データの整合性を必要とするものからjQueryを使用することに少し悩んでいます。これはすべてサーバー上で実行できると確信しています。すぐに見ようと思います。
MikeSchinkel

1
@マイク:うん、私も少し心配です。ただし、JavaScriptが関与するインスタンスは多数あるため、このソリューションに十分満足していると判断しました。ただし、代替方法についてのフィードバックを喜んで受け取ります。機会があれば、これをWordPressリポジトリに提出したいと思いますが、あなたが戻ってくるものを待って見ることができます。ありがとう!
リックカラン

@Mikeまたは@Rick-メディアが追加されたときに特定のカテゴリに投稿を自動的に割り当てる別の例を提供できますか?カテゴリの関連付けは、彼がオンになっている投稿タイプに基づいているか、コードを介して手動で設定されていますか?
NetConstructor.com

@ NetConstructor.com -私には別の質問のように聞こえる...
MikeSchinkel

@ netconstructor.com:うん、もう一つの大きな質問のようですね。
リックカラン

4

これを作成しただけです。これは、フォームフィールドへの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配列を変更する必要があります)

シャバム、シャボズル。楽しい。


add_image_attachment_fields_to_save関数は、最後に$ postを返す必要があります。 wp_set_object_terms( $post['ID'], $terms, 'image-format' ); return $post;。また、投稿したスクリプトはregister_custom_taxonomiesを実行しません。とにかく素晴らしいスクリプトです。将来的には間違いなくこれを使用します!
ロブフェルメール

ああ、私は自分が便利だと思って一緒に石畳しました。ここですぐに修正します。返品の良い点は、しかし、私はそれに何の問題もありませんでした。
ドリューゴーリー

1

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

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

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


おかげで、私はそれを見てattachment_fields_to_edit、それがどうなるかを見ていきます。
リックカラン

1

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

全体像

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

フィルター可能なカテゴリー

実際、ページや投稿に表示されるカテゴリメタボックス全体を生成していますが、スタイリングの不足とjavascriptの欠落のために、メディアページで機能しない部分を隠しています。

メタボックスを完全に機能させる方法についてだれかが考えていることを歓迎します。これは後のバージョンで行う予定です。


0

素晴らしいプラグインリック-とても助かります。

onclickトリガーをonloadにバインドするのではなく、インラインに移動する(および他のいくつかのマイナーな調整を行う)場合、Flashバルクアップローダーでも機能します。現在のバージョンでは、jQueryロードイベントの後にFlashがロードされるため、オブジェクトはまだ存在しません。

修正された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);
}

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

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

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

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

}


ありがとうdjbokka!私は今、コードベースへの修正は、私が私のウェブサイトからダウンロードすることができ、プラグインファイル更新したことを追加しましたsuburbia.org.uk/page/projects.html#wos_media_categoriesを
リック・カランを
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.