创建帖子时,是否可以设置默认的自定义字段?


11

当我创建新帖子时,在单击“添加新内容”后,在帖子编辑器显示时,我不必使用下拉菜单并选择要使用的自定义字段,而是希望已有一些默认的自定义字段输入开口端。

在视觉上,代替:

在此处输入图片说明

我想要类似的东西:

在此处输入图片说明

我知道有一些插件(CPT,更多字段等),但是我想用一种简单的方法来完成基本功能。

我尝试过这样的事情(我正在使用自定义帖子类型'product'):

function register_custom_fields( $post_ID ) {

    global $wpdb;

        if( !wp_is_post_revision( $post_ID ) ) {

            add_post_meta( $post_ID, 'reference', '', true);
            add_post_meta( $post_ID, 'price', '', true);

        }

}

add_action('edit_product', 'register_custom_fields');

但这似乎不起作用。我认为该挂钩可能是错误的(因为edit_post在更新后出现),但是我看不到“新帖子”的任何挂钩(在用户单击wp admin中的“新帖子”之后)。有没有 ?

还是整个想法是错误的,还有另一种方法?

Answers:


9

动作挂钩save_post在保存时被调用,但是我不知道您现在是否可以添加元数据。但是在用action hook保存帖子后,应该可以创建/更新元数据updated_post_meta

编辑

要在创建后的屏幕上预先选择一些元字段(自定义字段),您必须首先添加这些元值并添加一个空值。

如果查看文件中的post_custom_meta_box()函数(这是使用的metabox的回调postcustom),则wp-admin/includes/meta-boxes.php可以看到该函数正在list_meta()用于创建预选的元字段。

现在,让我们看一下程序流程,直到显示此元框为止(我们正在寻找可以在此处使用的动作/过滤器挂钩):

  1. WordPress加载文件 post-new.php
  2. 该文件39根据功能在数据库中生成默认帖子get_default_post_to_edit()。真好。基本上,帖子已经作为自动草稿存储在数据库中。不幸的是,目前没有任何挂钩可以更改这些数据或添加新内容。
  3. 下一步,edit-form-advaned.php包括文件。该文件将生成Hole admin页面,并包括基于supports帖子类型参数的所有必需的metabox 。
  4. 在线136包含自定义字段metabox postcustom,并调用上述函数。同样,没有可以使用的动作挂钩。

结论

我认为唯一的方法是使用jQuery或重载postcustommetabox并在运行list_meta()函数之前添加meta值。

例如

add_action('admin_menu', 'wpse29358_replaceMetaBoxes'); // maybe add_meta_boxes hook
function wpse29358_replaceMetaBoxes() {
    remove_meta_box('postcustom', {POST_TYPE}, 'normal');
    add_meta_box('postcustom', __('Custom Fields'), 'wpse29358_postcustomMetabox', {POST_TYPE}, 'normal', 'core');
}

function wpse29358_postcustomMetabox($post) {
    // Add your meta data to the post with the ID $post->ID
    add_post_meta($post->ID, 'key', 'value');

    // and then copy&past the metabox content from the function post_custom_meta_box()
}

问题是我现在暂时不尝试添加任何内容,而是尝试显示一些自定义字段输入,当用户在编辑页面上观看时已经打开(请参见屏幕截图更新)
mike23 2011年

啊。现在我明白了您的问题。我已经编辑了答案。
rofflox11年

3

这是添加自定义字段支持的正确方法(编辑帖子时不会出现空白字段)

function set_default_meta($post_ID){
    $current_field_value = get_post_meta($post_ID,'Sort Order',true);
    $default_meta = '100'; // value
    if ($current_field_value == '' && !wp_is_post_revision($post_ID)){
            add_post_meta($post_ID,'Sort Order',$default_meta,true);
    }
    return $post_ID;
}
add_action('wp_insert_post','set_default_meta');

1

您应该使用save_post操作并通过检查帖子类型来隔离您的操作,因为它可以在所有帖子类型上运行。显然,您还必须在其中构建更多逻辑,以使其适合您。您可能应该设置一个post meta字段,以检查是否已经设置了默认值一次,这样,如果用户希望将post meta字段留空,则不会感到沮丧。

如果您希望默认值为null(如您的代码示例所示),则不要创建函数,因为这只会增加开销,并且默认情况下,不会使用值填充post meta字段。

function register_custom_fields( $post_ID ) {
    //Do nonce checking here
    if( !wp_is_post_revision( $post_ID ) ) {
        if('product' === $_REQUEST['post_type']){
            $reference = $_REQUEST['reference'] ? esc_html($_REQUEST['reference']) : 'default_value';
            $price = $_REQUEST['price'] ? esc_html($_REQUEST['price']) : 'default_value';
            update_post_meta( $post_ID, 'reference', $reference);
            update_post_meta( $post_ID, 'price', $price);
        }
    }
}
add_action('save_post', 'register_custom_fields');

1

我希望为我正在开发的WP网站上的每个自定义帖子提供唯一的元描述。因此,我也在寻找默认的自定义字段并进入了此字段。

我知道这是一篇很老的文章,但我想我应该发布在mariokostelac.com上找到的简单答案。

kg是我的命名空间,您可以为函数命名。一般来说,我对钩子和WP自定义还很陌生,但是我相信wp_insert_post是您要寻找的钩子。

add_action('wp_insert_post', 'kg_set_default_custom_fields');

function kg_set_default_custom_fields($post_id)
{
    if ( $_GET['post_type'] != 'page' ) {
        add_post_meta($post_id, 'meta-description', '', true);
    }

    return true;
}

仅供参考:有get_post_type()。另外,进行松散比较时,应使用YODA样式条件语法。
kaiser 2012年

@kaiser对YODA风格是什么意思?为什么还get_post_type($post_id) $_GET['post_type']
阿齐兹

1
使用比较前的'page' === $_GET['post_type']。否则,当您忘记单个值时,=您可能会遇到以下情况:分配一个值而不是比较两个值。这最终将成为数据库中的垃圾。您可能还想使用=== 类型安全比较(值page?和类型值string?)
kaiser

1
@kasier我看-所以最终的代码是这样的:'page' === get_post_type($post_id)
阿齐兹

-1

如果有人需要按邮寄类型接受自定义字段,我将下面的代码留给我做,对我来说很好:)

function awh_field_type($post_id){
$awh_f_post = get_post_type($post_id);
$meta_value = '';
$meta_name = 'custom';
    if($awh_f_post == 'product'){
        add_post_meta($post_id,$meta_name,$meta_value,true);
    }
return $awh_f_post;

} add_action('wp_insert_post','awh_field_type');

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.