未保存自定义元框数据

时间:2019-11-04 作者:sialfa

经过两天的研究和没有答案的问题,今天有人向我建议了一种方法,可以在wordpress图像中添加一个自定义metabox字段。我的工作范围是在上传或修改图像时添加url,目前我只能显示输入字段,用户可以在其中添加url,但不会保存输入,我无法将其返回前端。

我想将此自定义metabox函数用于get_post_gallery() 这将输出我在图库中添加的图像的url,但我不知道如何组合这些图像,我需要修复插入url的保存。谁能帮助我或指导我实施?

<?php
 function add_image_link()
 {
   add_meta_box(
     \'image_link_box\',
     \'Link image to url\',
     \'image_link_field\',
     \'attachment\'
   ); 
 }
 add_action( \'add_meta_boxes_attachment\', \'add_image_link\' );

 function image_link_field( $post )
 {
   ?>
   <label for="image-link">Link URL</label>
   <input type="text" name="image_link" id="image-link" class="postbox">
   <?php
 }

 function save_image_link( $post_id )
 {
   if( array_key_exists( \'image_link\', $_POST ) ){
     update_post_meta(
       $post_id,
       \'image_link_url\',
       $_POST[\'image_link\']
     );
   }

 }
 add_action( \'save_post_attachment\', \'save_image_link\' );
?>

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

实际上,对于这种类型的帖子attachment, 您应该使用edit_attachment (动作)挂钩和非挂钩save_post_attachment:

add_action( \'edit_attachment\', \'save_image_link\' );        // use edit_attachment
//add_action( \'save_post_attachment\', \'save_image_link\' ); // not save_post_attachment
其次,您的元框当前没有显示元值,因此您应该在输入字段中显示值,您可以使用get_post_meta() 要检索元值,请执行以下操作:

<input type="text" name="image_link" id="image-link" class="postbox" value="<?php // wrapped
    echo esc_attr( get_post_meta( $post->ID, \'image_link_url\', true ) ); ?>">
PS:您应该始终清理/转义用户提供的和不受信任的数据;e、 g.以上我使用esc_attr() 要转义该值,可以使用sanitize_text_field() 要清理提交的值,请执行以下操作:sanitize_text_field( $_POST[\'image_link\'] ).

示例实现使用get_post_gallery()(对于[gallery] shortcode)

这是基于example here. 正如我之前提到的,您可以使用get_post_meta() 检索自定义字段的值(在您的情况下是URL地址)。

// Get the gallery data (attachment IDs and URLs).
$gallery = get_post_gallery( get_the_ID(), false );
if ( $gallery ) {
    foreach ( wp_parse_id_list( $gallery[\'ids\'] ) as $i => $att_id ) {
        // Get the custom link URL.
        $url = get_post_meta( $att_id, \'image_link_url\', true );

        // Display the image. You can add other attributes later..
        echo \'<a href="\' . esc_url( $url ) . \'"><img src="\' . // wrapped
            esc_url( $gallery[\'src\'][ $i ] ). \'" alt=""></a> \';
    }
}
<如果您希望能够通过Attachment Details dialog, 然后,您应该忘记使用元框,而是尝试以下操作:

此部分将自定义字段添加到对话框中:

add_filter( \'attachment_fields_to_edit\', function ( $form_fields, $post ) {
    $form_fields[\'image_link\'] = array(
        \'label\' => \'Link to image URL\',
        \'value\' => get_post_meta( $post->ID, \'image_link_url\', true ),
    );

    return $form_fields;
}, 10, 2 );

add_filter( \'attachment_fields_to_save\', function ( $post, $attachment ) {
    if ( isset( $attachment[\'image_link\'] ) ) {
        $meta_input = isset( $post[\'meta_input\'] ) ?
            (array) $post[\'meta_input\'] : [];

        $meta_input[\'image_link_url\'] = $attachment[\'image_link\'];

        $post[\'meta_input\'] = $meta_input;
    }

    return $post;
}, 10, 2 );
image_link 是表单字段(input) 姓名,鉴于image_link_url 是元键。

此解决方案还可以与标准的“编辑媒体”页面配合使用;在“附件详细信息”对话框中,您可以通过单击“编辑更多详细信息”链接访问该页面。

我用于测试的完整代码here.