有人可以解释为什么在创建元框时,回调需要通过$ post-> ID传递post id,但是使用动作钩'save_post',该函数可以传递$ post_id。关于何时使用哪一个的一般解释将有助于澄清我一直遇到的一些问题,谢谢。
例如:
function show_custom_meta_box($post) {
$meta = get_post_meta($post->ID, 'custom_meta_class', true);
// Use nonce for verification
echo '<input type="hidden" name="custom_meta_box_nonce" value="'.wp_create_nonce(basename(__FILE__)).'" />';
// Begin the field table and loop
echo '<table class="form-table">';
echo '<tr>
<th><label for="custom-meta-class">Custom Meta Box</label></th>
<td>
<input class="widefat" type="text" name="custom-meta-class" id="custom-meta-class" value="'.$meta.'" size="50" />';
echo '</td></tr>';
echo '</table>'; // end table
}
和$ post_id
function save_custom_meta($post) {
if( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) return;
/* Verify the nonce before proceeding. */
if ( !isset( $_POST['custom_meta_box_nonce'] ) || !wp_verify_nonce( $_POST['custom_meta_box_nonce'], basename( __FILE__ ) ) )
return $post_id;
$post_type = get_post_type_object( $post->post_type );
/* Check if the current user has permission to edit the post. */
if ( !current_user_can( $post_type->cap->edit_post, $post_id ) )
return $post_id;
/* Get the posted data and sanitize it for use as an HTML class. */
$new_meta_value = ( isset( $_POST['custom-meta-class'] ) ? sanitize_html_class( $_POST['custom-meta-class'] ) : '' );
/* Get the meta key. */
$meta_key = 'custom_meta_class';
/* Get the meta value of the custom field key. */
$meta_value = get_post_meta( $post_id, $meta_key, true );
if ( $new_meta_value && '' == $meta_value )
add_post_meta( $post_id, $meta_key, $new_meta_value, true );
/* If the new meta value does not match the old value, update it. */
elseif ( $new_meta_value && $new_meta_value != $meta_value )
update_post_meta( $post_id, $meta_key, $new_meta_value );
/* If there is no new meta value but an old value exists, delete it. */
elseif ( '' == $new_meta_value && $meta_value )
delete_post_meta( $post_id, $meta_key, $meta_value );
}
答案 0 :(得分:0)
操作挂钩save_post返回$ post_id。
show_custom_meta_box
不是WordPress挂钩,而是自定义函数。它使用get_post_meta,该函数需要$post_id
。
没有必要给$ post。您只需编辑代码即可使用ID,而不是post Object:
function show_custom_meta_box($post_id) {
$meta = get_post_meta($post_id, 'custom_meta_class', true);
}
答案 1 :(得分:0)
我没有答案,但我遇到了完全相同的问题。我很惊讶在过去的 7 年里没有人插话。
这是我的代码,它有效(在functions.php中)
add_action('save_post','extract_citations',100,1);
function extract_citations($post_id){
$the_post = get_post($post_id);
$content = $the_post->post_content;
preg_match_all('/<a\s+.*?href=[\"\']?([^\"\' >]*)[\"\']?[^>]*>(.*?)<\/a>/i',$content,$citation_array);
$citation_urls = $citation_array[1];
update_post_meta($post_id,'citations',serialize($citation_urls));
}
尽管理论上是正确的,但这里的代码不起作用:
add_action('save_post','extract_citations',100,1);
function extract_citations($post){
$the_post = get_post($post->ID);
$content = $the_post->post_content;
preg_match_all('/<a\s+.*?href=[\"\']?([^\"\' >]*)[\"\']?[^>]*>(.*?)<\/a>/i',$content,$citation_array);
$citation_urls = $citation_array[1];
update_post_meta($post->ID,'citations',serialize($citation_urls));
}