web-dev-qa-db-ja.com

メディアを節約する - どのフックが発射されるのか?

ハウディ、

私はいつものように、メディアライブラリに画像を保存するときに発生するコードを実行しようとしています。この時点で私はwordpressにフックし、そしてwordpressを別のURLにリダイレクトしたいです。これは、アップロードされたメディアのリストにユーザーを案内するのではなく、代わりにそれらを画像操作ツールに案内できるようにするためです。

メタデータが作成される直前に起動するフィルタを見つけましたが、ファイルが保存されるときには何もしませんか。

ありがとう、

7
Richard Bagshaw

実際には、少なくとも私の知る限り、メディアファイルのアップロード後に発生するフックはありません。メディアファイルやデータのアップロードや保存の過程で利用可能なフックの問題点は、それらがプロセスの一部に限定されていることであり、それらを使用することは信頼できません。たとえば、add_attachmentは、ファイルメタデータを編集する前に新しいファイルがアップロードプロセスを完了した後に発生します。この時点でユーザーをリダイレクトしようとすると、複数のファイルをアップロードした場合、後続のファイルのアップロードプロセスは中断されます。他の種類の行動には適しているかもしれません。

しかし、あなたの特定のケースでは、admin_initアクションフックにフックして、ファイルをアップロードまたは編集した後にメディアライブラリ画面にあるかどうかをチェックすることで、アップロード前に添付ファイルの数を保存し、アップロード後の添付ファイルの数と比較することができます。アップロード:

add_action('admin_init', 'redirect_after_media_save');
function redirect_after_media_save() {

    global $pagenow;

    // when visiting the upload screen, we save the number of attachments
    if ( $pagenow == 'media-new.php' ) {
        $attachments_before = array_sum((array)wp_count_attachments());
        update_option('count_attach_before', $attachments_before);
    }

    if ( $pagenow == 'upload.php' ) { // we are on media library page

        // get attachments count before and after upload
        $attachments_before = get_option('count_attach_before');
        $attachments_after = array_sum((array)wp_count_attachments());

        if ( 
            // there are new files uploaded
            ( wp_get_referer() == admin_url('media-new.php') && $attachments_after > $attachments_before )
            ||
            // or we have just edited media file
            isset($_GET['posted'])
        ) {
                // redirect to desired location
                wp_redirect(admin_url());
                exit;
        }
    }
}

このコードは、メディアファイルのアップロードまたは編集が成功した後にユーザーをダッシュ​​ボードにリダイレクトします。必要に応じて調整できます。リダイレクト以外のタスクを実行したい場合は、admin_init以外のadminフックを選択することもできます。

4
Ahmad M

メディアの保存にアクションがないように見えますが、フィルタがあります。残念ながらそれはあなたが何かをすることができることを意味します、あなたはただ実際に何かを反響させることができないか、あなたはフィルタを破るでしょう。

add_filter('attachment_fields_to_save', 'attachment_stuff');
function attachment_stuff($stuff){

    //Do stuff here, but don't echo anything or you'll break the filter.

    return $stuff;
}

$ stuffは、メディアアイテムページで使用されているフィールドの配列です。より一般的な管理パネルフックにフックしたり、 'editattachment'の$ _GET ['action']値をチェックするなど、他のことを試すこともできます。

3
eddiemoya

ちょっと遅い答えかもしれませんが、私は似たようなシナリオがあり、解決策を共有したいと思いました。

テーマのfunctions.php(プラグインを作成しても同様に動作します)では、アップロードされた各ファイルに基づいて'add_attachment'フックを使用して新しい投稿(カスタム投稿タイプ 'talk')を作成しました。もちろん、この例はちょっと輝いているかもしれませんが、これはアップロードされた各メディア添付ファイルを解析するのに役立ちました。

<?php
function cpt_from_attachment($attachment_ID)
{          
    global $current_user;
    get_currentuserinfo();

    $attachment_post = get_post( $attachment_ID );

    $type = get_post_mime_type($attachment_ID);
    if(strpos($type, 'audio') === 0)
    {
        // Create new custom post object only for audio files
        $my_post = array(
          'post_title'    => $attachment_post->post_title,
          'post_content'  => $attachment_post->post_content,
          'post_type'   => 'talk',
          'post_author'   => $current_user->ID
        );

        // Insert the custom post into the database
        $post_id = wp_insert_post( $my_post );
        wp_update_post( array(
                'ID' => $attachment_ID ,
                'post_parent' => $post_id
            )
        );
        wp_set_post_terms( $post_id, get_post_meta($attachment_ID, "artist", true), 'speaker' );
    }
}

add_action("add_attachment", 'cpt_from_attachment');
2
Calle