让wordpress的文章数据表 增加一个字段,使其能在文章编辑页能编辑,并能通过rest api 获取出来。

例:给文章加一个缩略图字段 litpic 

首先 通过mysql 给文章表 wp_posts 加一个字段 litpic

然后在主题的function.php 后面添加如下代码:

add_action( "add_meta_boxes", "myplugin_add_custom_box"); add_action( "save_post", "myplugin_save_postdata");function myplugin_add_custom_box() {add_meta_box("myplugin_sectionid","设置缩略图", // 可自行修改标题文字"myplugin_inner_custom_box","post");}function myplugin_inner_custom_box( $post ) {global $wpdb;// Use nonce for verificationwp_nonce_field( plugin_basename( __FILE__ ), "myplugin_noncename" );// 获取固定字段litpic的值,用于显示之前保存的值// 此处wp_posts新添加的字段为litpic,多个用半角逗号隔开$date = $wpdb->get_row( $wpdb->prepare( "SELECT litpic FROM $wpdb->posts WHERE ID = %d", $post->ID) );// litpic 字段输入框的HTML代码echo "<label for="litpic_new_field">图片url </label>";echo "<input type="text" id="litpic_new_field" name="litpic_new_field" value="".$date->litpic."" size="28" />";// 多个字段依此类推}function myplugin_save_postdata( $post_id ) {// verify if this is an auto save routine.// If it is our form has not been submitted, so we dont want to do anythingif ( defined( ’DOING_AUTOSAVE’ ) && DOING_AUTOSAVE )return;// verify this came from the our screen and with proper authorization,// because save_post can be triggered at other timesif ( !wp_verify_nonce( $_POST["myplugin_noncename"], plugin_basename( __FILE__ ) ) )return;// 权限验证if ( "post" == $_POST["post_type"] ) {if ( !current_user_can( "edit_post", $post_id ) )return;}// 获取编写文章时填写的固定字段的值,多个字段依此类推$litpic = $_POST["litpic_new_field"];global $wpdb;$wpdb->update( "$wpdb->posts",// 以下一行代码,多个字段的话参照下面的写法,单引号中是字段名,右边是变量值。半角逗号隔开array( "litpic" => $litpic),array( "ID" => $post_id ),// 添加了多少个新字段就写多少个%s,半角逗号隔开array( "%s"),array( "%d"));}


但此时 rest api还不会把litpic字段输出。

打开 /wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php 文件。


if ( ! empty( $schema["properties"]["litpic"] ) ) { $data["litpic"] = $post->litpic; }

"litpic" => array( "description" => __( "A litpic to protect access to the content and excerpt." ), "type" => "string", "context" => array( "view", "edit", "embed" ), ),

$post_type_attributes = array( "title", "editor", "author", "excerpt", "thumbnail", "comments", "revisions", "page-attributes", "post-formats", "custom-fields", "litpic", ); $fixed_schemas = array( "post" => array( "title", "editor", "author", "excerpt", "thumbnail", "comments", "revisions", "post-formats", "custom-fields", "litpic", ),

case "litpic": $schema["properties"]["litpic"] = array( "description" => __( "The ID for the litpic of the object." ), "type" => "string", "context" => array( "view", "edit", "embed" ), ); break;

现在,rest api 就可以把litpic 字段输出了。