我想要一个自定义字段,一次只能分配给一个帖子。理想情况下直接来自仪表板。
假设featured post
上的自定义字段/post-123
的值为true
。
如果我将featured post: true
分配给post-111
,则post-123
的{{1}} - 自定义字段的值需要获取值featured post
或完全删除。
这意味着我的自定义字段只能分配到一个帖子
OR
具有指定值的自定义字段只能存在一次。
是否有可以执行此操作的插件?或者是否可以使用WordPress插件Types?
答案 0 :(得分:0)
自定义字段保存/更新/删除在操作挂钩save_post
中完成。
在更新当前发布的元数据之前,我们会查询可能包含相同元数据的所有其他帖子并将其移除为正数。
基本上:
if ( isset( $_POST['exclusive_post'] ) )
{
// CHECK FOR OTHER POSTS THAT HAVE THE META DATA SET
$args = array(
'numberposts' => -1,
'offset' => 0,
'meta_key' => 'exclusive_post',
'post_type' => 'post',
'post_status' => 'publish'
);
$results = get_posts( $args );
foreach( $results as $other_post)
{
// REMOVE THE META DATA FROM OTHER POSTS
delete_post_meta( $other_post->ID, 'exclusive_post' );
}
// UPDATE THE CURRENT POST META DATA
update_post_meta( $post_id, 'exclusive_post', $_POST['exclusive_post'] );
}
else
{
// NO POST META DATA IN CURRENT POST, REMOVE META
delete_post_meta( $post_id, 'exclusive_post' );
}
这里是一个使用基于Add a checkbox to post screen that adds a class to the title的元框的完整工作示例:
<?php
/**
* Plugin Name: Exclusive Post Meta Box
* Description: Creates a custom field that can only be assigned to one post.
* Plugin URI: http://stackoverflow.com/q/15721612/1287812
* Author: brasofilo
* Author URI: https://wordpress.stackexchange.com/users/12615/brasofilo
*/
/* Define the custom box */
add_action( 'add_meta_boxes', 'wpse_61041_add_custom_box' );
/* Do something with the data entered */
add_action( 'save_post', 'wpse_61041_save_postdata', 10, 2 );
/* Adds a box to the main column on the Post and Page edit screens */
function wpse_61041_add_custom_box() {
add_meta_box(
'wpse_61041_sectionid',
'Exclusive Post',
'wpse_61041_inner_custom_box',
'post',
'side',
'high'
);
}
/* Prints the box content */
function wpse_61041_inner_custom_box($post)
{
// Use nonce for verification
wp_nonce_field( plugin_basename( __FILE__ ), 'wpse_61041_noncename' );
// Get saved value, if none exists, "default" is selected
$saved = get_post_meta( $post->ID, 'exclusive_post', true);
printf(
'<input type="checkbox" name="exclusive_post" value="exclusive_post" id="exclusive_post" %1$s />'.
'<label for="exclusive_post"> This is the one.' .
'</label><br>',
checked($saved, 'exclusive_post', false)
);
}
/* When the post is saved, saves our custom data */
function wpse_61041_save_postdata( $post_id, $post_object )
{
// verify if this is an auto save routine.
// If it is our form has not been submitted, so we dont want to do anything
if ( 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 times
if ( !wp_verify_nonce( $_POST['wpse_61041_noncename'], plugin_basename( __FILE__ ) ) )
return;
// don't run if saving revision.
if ( 'revision' == $post_object->post_type )
return;
if ( isset( $_POST['exclusive_post'] ) )
{
// CHECK FOR OTHER POSTS THAT HAVE THE META DATA SET
$args = array(
'numberposts' => -1,
'offset' => 0,
'meta_key' => 'exclusive_post',
'post_type' => 'post',
'post_status' => 'publish'
);
$results = get_posts( $args );
foreach( $results as $other_post)
{
// REMOVE THE META DATA FROM OTHER POSTS
delete_post_meta( $other_post->ID, 'exclusive_post' );
}
// UPDATE THE CURRENT POST META DATA
update_post_meta( $post_id, 'exclusive_post', $_POST['exclusive_post'] );
}
else
{
// NO POST META DATA IN CURRENT POST, REMOVE META
delete_post_meta( $post_id, 'exclusive_post' );
}
}