拯救媒体-哪个钩子被解雇了?

时间:2012-05-30 作者:Richard Bagshaw

豪迪,

我正在尝试触发一些代码,当我在媒体库中保存图像时会出现这些代码,按照通常的方式,我选择文件,上载,输入元数据,然后单击保存。此时,我想连接到wordpress,并将wordpress重定向到另一个URL。这样,我就可以将用户带到图像处理工具,而不是带到已上载媒体的列表中。

我发现一个过滤器在创建元数据之前启动,但在保存文件时没有启动?

谢谢

3 个回复
SO网友:Ahmad M

事实上,至少据我所知,媒体文件上传后并没有触发挂钩。在上传和保存媒体文件和数据的过程中可用的挂钩的问题是,它们仅限于流程的一部分,因此使用其中任何一个都不可靠。例如add_attachment 在新文件在编辑文件元数据之前完成上载过程后激发,如果此时您打算重定向用户,则会中断后续文件的上载过程如果我们有多个文件上载,则可能适用于其他类型的操作。

但是,对于您的具体情况,您可以admin_init 操作挂钩并检查上载或编辑文件后是否在media library屏幕上,我们知道通过在上载前保存附件数量并进行比较,可以在上载后增加附件数量:

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 如果要执行重定向以外的任务。

SO网友:Calle

也许回答有点晚,但我有一个类似的场景,希望与大家分享解决方案。

在里面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\');

SO网友:eddiemoya

看起来没有媒体保存操作,但有一个筛选器。不幸的是,这意味着你可以做一些事情,你只是不能实际回显任何东西,否则你会打破过滤器。

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”的$\\u GET[\'action\']值。

结束

相关推荐

MEDIA_SIDELOAD_IMAGE的特定文件夹和不生成缩略图

我正在使用WordPress中的media\\u sideload\\u image功能从web上的其他位置自动上载图像。我想再添加两个功能。将这些图像添加到我的系统中的特定文件夹中,我将在代码中指定一次。不应为这些图像生成缩略图,只需导入图像并将其放入文件夹,然后附加到帖子即可。如何实现第1点和第2点?谢谢