当前位置: 首页 > 知识库问答 >
问题:

从回调函数中获取文章元数据

朱兴安
2023-03-14

我正在开发我的第一个WP插件,我被卡住了。

我在内容编辑器下面的帖子页面上创建了一个定制字段(字段1)。它保存正确。:)

添加媒体时,我在媒体库弹出窗口中创建了一个自定义字段(字段2)。它保存正确。:)

我想做的是使用字段1中的值作为字段2的默认值。

我怀疑问题出在attachment_fields_to_edit回调函数中。

我认为$post现在指的是实际的“文件附件帖子”,而不是帖子本身,所以当我引用我保存的值时:

$post_meta = get_post_meta( $post->ID );

它实际上是提取与该附件相关联的所有元,而不是当前帖子。有可能从实际帖子中提取meta吗?

这段代码来自于法典:

function my_add_attachment_location_field( $form_fields, $post ) {
    $field_value = get_post_meta( $post->ID, 'location', true );
    $form_fields['location'] = array(
        'value' => $field_value ? $field_value : '',
        'label' => __( 'Location' ),
        'helps' => __( 'Set a location for this attachment' )
    );
    return $form_fields;
}
add_filter( 'attachment_fields_to_edit', 'my_add_attachment_location_field', 10, 2 );

function my_save_attachment_location( $attachment_id ) {
    if ( isset( $_REQUEST['attachments'][$attachment_id]['location'] ) ) {
        $location = $_REQUEST['attachments'][$attachment_id]['location'];
        update_post_meta( $attachment_id, 'location', $location );
    }
}
add_action( 'edit_attachment', 'my_save_attachment_location' );

我如何获得当前帖子的_post_meta,我们正在将附件插入到这个帖子中?这需要在上面codex代码中的my _ add _ attachment _ location _ field回调函数中发生。

谢谢

共有3个答案

寿翰飞
2023-03-14

好吧,试试另一种方式...您将无法在导航器中轻松获取帖子ID。我不确定位置是什么,但如果你想将图像保存为post meta,我使用这个............

步骤:

1.create一个新的js文件访问http://jsfiddle.net/dheffernan/BB37U/2/并将那里的js复制到js文件中。调用它miu_script.js或者如果你想更改它,你需要对下面的代码做一些mod。将它保存在你的插件文件夹中(如果你想将它移动到子文件夹,请在下面更改路径。

>

  • 在下面的代码中输入您的函数-它会将图像位置保存为序列化的url,并在名为“_images”的字段中再次更改,如果您需要修改代码。

    下面可能有错误,我有Oophtml" target="_blank">格式的,所以如果有问题请告诉我。如果有,请注意php错误,如果没有php错误但它不工作,请检查chrome或firefox中的控制台。我可以调试。

    在函数中,php

    function add_image_meta_box() {
       add_meta_box(
                    'multi_image_upload_meta_box'
                    , __('Upload Multiple Images', 'miu_textdomain')
                    , 'render_meta_box_content'
                    , $post_type
                    , 'advanced'
                    , 'high'
            ); 
    }
    
    add_action( 'add_meta_boxes', 'add_image_meta_box' );
    
    
    
    
    function render_meta_box_content($post) {
    
        wp_nonce_field('miu_inner_custom_box', 'miu_inner_custom_box_nonce');
    
        $value = get_post_meta($post->ID, '_images', true); // <-- change field if wanted, there is 1 more below that will need the same name
    
        $metabox_content = '<div id="miu_images"></div><input type="button" onClick="addRow()" value="Add Image" class="button" />';
        echo $metabox_content;
    
        $images = unserialize($value); //<--- when using the images use this!!
    
        $script = "<script>
            itemsCount= 0;";
        if (!empty($images))
        {
            foreach ($images as $image)
            {
                $script.="addRow('{$image}');";
            }
        }
        $script .="</script>";
        echo $script;
    }
    
    
    
    
    
    function save_image($post_id){
    
        if (!isset($_POST['miu_inner_custom_box_nonce']))
            return $post_id;
    
        $nonce = $_POST['miu_inner_custom_box_nonce'];
    
        if (!wp_verify_nonce($nonce, 'miu_inner_custom_box'))
            return $post_id;
    
        if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
            return $post_id;
    
    
        if ('page' == $_POST['post_type']) {
    
            if (!current_user_can('edit_page', $post_id))
                return $post_id;
        } else {
    
            if (!current_user_can('edit_post', $post_id))
                return $post_id;
        }
    
        $posted_images = $_POST['miu_images'];
        $miu_images = array();
        foreach ($posted_images as $image_url) {
            if(!empty ($image_url))
                $miu_images[] = esc_url_raw($image_url);
        }
    
    
        update_post_meta($post_id, '_images', serialize($miu_images));<--if you changed this above.......make sure they match
      }
    
      add_action( 'save_post', 'save_image' );
    
    
      function enqueue_scripts($hook){
        if ('post.php' != $hook && 'post-edit.php' != $hook && 'post-new.php' != $hook)
            return;
        wp_enqueue_script('miu_script', plugin_dir_url(__FILE__) . 'miu_script.js', array('jquery')); //<--this is the path!!! change if wanted (prob a good idea to add to js folder)
    }
      add_action('admin_enqueue_scripts', 'enqueue_scripts');
    

  • 燕琨
    2023-03-14

    您可以尝试以下操作:

    /**
     * Display custom 'location' attachment field
     */
    
    function so_22850878_attachment_fields_to_edit( $form_fields, $post )
    {
        $field_value = get_post_meta( $post->post_parent, 'location', true );
    
        $form_fields['location'] = array(
            'value' => $field_value ? $field_value : '',
            'label' => __( 'Location' ),
            'helps' => __( 'Set a location for this attachment' )
        );  
    
        return $form_fields;
    }
    
    add_filter( 'attachment_fields_to_edit', 
                'so_22850878_attachment_fields_to_edit', 10, 2 );
    

    /**
     * Edit attachment fields
     */
    
    function so_22850878_edit_attachment( $attachment_id )
    {
        $p = get_post( $attachment_id );
    
        if ( isset( $_REQUEST['attachments'][$attachment_id]['location'] ) )
        {
            $location = $_REQUEST['attachments'][$attachment_id]['location'];
    
            // Save the value of the 'location' attachment field 
            // to the 'location' post meta of the post parent if it exists:
    
            if( ! is_null( $p )
                && 0 < $p->post_parent 
            )
                update_post_meta( $p->post_parent, 
                                  'location', 
                                   sanitize_text_field( $location ) 
                );
        }
    }
    
    add_action( 'edit_attachment', 'so_22850878_edit_attachment' );
    

    以从媒体弹出窗口更新父帖子的位置帖子元值。

    如果您直接从媒体库页面编辑附件,您可能也想检查一下:

    /**
     * Save attachment fields
     */
    
     function so_22850878_attachment_fields_to_save( $post, $attachment )
    {
        $p = get_post( $post['ID'] );
    
        // Save the value of the 'location' attachment field 
        // to the 'location' post meta of the post parent if it exists:
    
        if( isset( $attachment['location'] ) 
            && ! is_null( $p ) 
            && 0 < $p->post_parent 
        )
            update_post_meta( $p->post_parent, 
                              'location', 
                               sanitize_text_field( $attachment['location'] ) 
            );
    
        return $post;
    }
    
    add_action( 'attachment_fields_to_save', 
                'so_22850878_attachment_fields_to_save', 10, 2 );
    

    我不确定你的想法是什么样的工作流程,但我认为你的想法有问题,据我所知:

    当您更新媒体弹出窗口中的位置字段时,看起来您想要更新父帖子的位置帖子元值。但是,由于当您将图像插入帖子编辑器时,帖子编辑屏幕不会更新,因此当您更新帖子时,您的位置值将被旧值覆盖。

    因此,我想知道是否可以使用隐藏的post元值,例如_location

    希望这有帮助。

    干旺
    2023-03-14

    我能想到的一种方法是:

    $actual_post_id=$post-

    然后你可以做:

    get_post_meta($actual_post_id)

     类似资料:
    • 问题内容: 我正在编写Go程序。从这个Go程序中,我想调用另一个文件中定义的Python函数并接收该函数的返回值,以便可以在Go程序的后续处理中使用它。我在将所有返回的数据恢复到我的Go程序时遇到了麻烦。以下是我认为可行的最低示例,但显然无效: gofile.go pythonfile.py 如果我打电话,我得到以下输出: 一些注意事项: 我在Python调用中使用该标志,因此可以直接调用该函数。

    • 大家好,我是java多线程新手。有人能帮我吗: 我的服务: SpringBoot应用程序: 异步配置: 控制器: 当我点击这个来自邮递员的get请求时,它在响应中显示为空白。我知道我的调用是异步进行的,响应甚至在调用我的方法之前就回来了。有没有办法通过更改邮递员或Spring启动应用程序中的一些设置来查看此响应

    • 我被迫在getJSON回调函数中使用该函数之外的数据。看一看: 这就是我尝试的,但是失败了,$值仍然设置为0,尽管在回调中它肯定设置为实际值。我知道为什么它会失败,因为AJAX请求是异步发送的。问题是,正确的方法,做回调里面的一切,是不可能的。如你所见,我需要在raty(插件)设置中检索JSON对象。我只会使用$. ajax()并将其设置为同步,但留档将其标记为1.8不建议使用。我宁愿不引入一个我

    • 我有一个blob触发器Azure函数,每次将新文件添加到我的blob存储时都会调用该函数。我自动获取该文件的名称作为输入。除了名称之外,我还需要附加到给定文件的元数据。我一直在研究数据输入绑定,但我无法理解它。我需要做些什么才能将文件元数据作为输入?或者,甚至只是在我的函数中访问它?

    • 问题内容: jQuery.unique允许您获取数组的唯一元素,但是文档说该函数主要供内部使用,并且仅对DOM元素起作用。另一个SO响应说该函数可以在数字上使用,但是此用例不一定是将来的证明,因为在文档中未明确说明。 鉴于此,是否存在“标准” jQuery函数,用于仅访问数组中的唯一值(特别是整数之类的基元)?(显然,我们可以使用函数构造一个循环,但是我们是jQuery的新手,并且想知道是否为此使