【问题标题】:Get custom fields values in filter on wp_insert_post_data在 wp_insert_post_data 上的过滤器中获取自定义字段值
【发布时间】:2014-03-10 03:25:19
【问题描述】:

大家好,感谢阅读。


环境

Wordpress + 高级自定义字段插件


问题:

我已经搜索了几个小时,但似乎找不到正确的语法来执行以下操作:

发布新帖子时,获取自定义字段值,以便用该值自动替换帖子的标题。示例:我创建一个帖子并在我的“时间”中设置“上午 10 点”自定义字段。帖子的标题会自动替换为“上午 10 点”。


示例:

所以我添加了一个过滤器:

add_filter('wp_insert_post_data', 'change_title') ;

function change_title($data)

{

    $time = XXX ; // How should I get this custom field value ?

    $new_title = 'Topic created at'.$time ;

    $data['post_title'] = $time ;

    return $data;

}

它一定很简单,但我已经尝试了 WP 和插件文档中可用的每个功能。如果有路过的人给我解决方案,我将非常感谢

提前致谢!

【问题讨论】:

    标签: php wordpress hook advanced-custom-fields


    【解决方案1】:

    高级自定义字段为每个创建的自定义字段创建一个“字段键”。在尝试访问自定义字段时,我能够引用此键值。在 Wordpress 管理部分查看帖子类型时,可以通过查看页面源找到字段键值。

    寻找data-field-key。您将在页面源中看到类似于data-field-key="field_5847b00820f13" 的值。在访问 wp_insert_post_data 过滤器中的 $postarr 参数中的值时使用此值。自定义字段将位于 $postarr 参数内名为 fields 的嵌套数组中。

    或者,可以通过从管理部分导航到高级自定义字段/导出选项来定位字段键值。进入高级自定义字段的导出页面后,选择导出到 PHP 选项,您将在生成的 PHP 代码中看到该值。

    在下面的示例中,我将连接两个高级自定义字段并更新函数返回的 $data 数组中的 post_title

    结果是post_title 值将通过内置的 Wordpress 保存后逻辑保存到数据库中。

    add_filter('wp_insert_post_data', 'slb_set_title', '99', 2);
    
    function slb_set_title ($data, $postarr){
      if($data['post_type']==='slb_subscriber'){
        $data['post_title'] = $postarr['fields']['field_5847b00820f13'] .' '.       
        $postarr['fields']['field_5847b03f20f14'];
      }
    return $data;
    }
    

    【讨论】:

      【解决方案2】:

      您实际上可以为您的字段值访问全局 $_POST 变量,但我想您可以通过使用 save_post 操作来更新您的帖子标题以更简洁的方式进行操作,例如:

      add_action('save_post', 'change_title');
      
      function change_title($post_id) {
          $time = get_field('time',$post_id);
          $post_title = 'Topic created at '. $time;
      
          // unhook this function so it doesn't loop infinitely
          remove_action('save_post', 'change_title');
      
          // update the post, which calls save_post again
          wp_update_post(array('ID' => $post_id, 'post_title' => $post_title));
      
          // re-hook this function
          add_action('save_post', 'change_title');
      }  
      

      假设您的 ACF 字段名称是“时间”。

      编辑:根据 Mark Chitty 的回答更新了答案。

      【讨论】:

      • 效果很好,非常感谢!据我所知,如果我在您的建议中理解正确,我们会在帖子创建后更新帖子,而我在帖子尚未创建时尝试获取自定义字段,对吗?
      • 这会导致无限循环。
      【解决方案3】:

      调整 Riadh 接受的答案(将作为评论添加,但还没有足够的代表):

      WordPress Codex 中所述,wp_update_post 包含save_post 挂钩,因此在save_post 挂钩内调用wp_update_post() 会创建一个无限循环。为避免这种情况,请取消挂钩然后重新挂钩您的函数,如下所示:

      add_action('save_post', 'change_title');
      
      function change_title($post_id) {
          $time = get_field('time',$post_id);
          $post_title = 'Topic created at '. $time;
      
          // unhook this function so it doesn't loop infinitely
          remove_action('save_post', 'change_title');
      
          // update the post, which calls save_post again
          wp_update_post(array('ID' => $post_id, 'post_title' => $post_title));
      
          // re-hook this function
          add_action('save_post', 'change_title');
      }    
      

      【讨论】:

        【解决方案4】:

        你可以试试这个

        add_filter( 'wp_insert_post_data', 'change_title', '99', 2 );
        
        function change_title($data , $postarr){
        
            $custom_field = 'custom_filed_name';
            $post_id = $postarr['ID'];
            $time = get_post_meta( $post_id, $custom_field, true );
        
            // Now you have the value, do whatever you want
        }
        

        【讨论】:

        • 这不会获取新创建帖子的自定义字段。它仅在更新现有帖子时有效。
        • 是的,它不会,save_post 是合适的钩子:-)
        猜你喜欢
        • 1970-01-01
        • 2020-12-25
        • 2022-10-24
        • 1970-01-01
        • 2018-09-08
        • 2013-08-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多