Код ниже работает почти безупречно, однако мое значение для заголовка страницы на одной из моих страниц продолжает появляться пустым после того, как несколько страниц обновится … Он несколько раз держится, а затем, кажется, сбрасывается на пустой. Я думаю, что у меня должен быть конфликт в коде ниже, но я не могу это понять.
Я разрешаю пользователю настраивать пользовательский заголовок страницы для сообщений, а также страниц через пользовательское поле ввода заголовка «пост / страница». Может ли кто-нибудь увидеть очевидную проблему здесь, которая может привести к сбросу титула страницы до пустого?
// =================== // = POST OPTION BOX = // =================== add_action('admin_menu', 'my_post_options_box'); function my_post_options_box() { if ( function_exists('add_meta_box') ) { //add_meta_box( $id, $title, $callback, $page, $context, $priority ); add_meta_box('post_header', 'Custom Post Header Code (optional)', 'custom_post_images', 'post', 'normal', 'low'); add_meta_box('post_title', 'Custom Post Title', 'custom_post_title', 'post', 'normal', 'high'); add_meta_box('post_title_page', 'Custom Post Title', 'custom_post_title', 'page', 'normal', 'high'); add_meta_box('postexcerpt', __('Excerpt'), 'post_excerpt_meta_box', 'page', 'normal', 'core'); add_meta_box('categorydiv', __('Page Options'), 'post_categories_meta_box', 'page', 'side', 'core'); } } //Adds the custom images box function custom_post_images() { global $post; ?> <div class="inside"> <textarea style="height:70px; width:100%;margin-left:-5px;" name="customHeader" id="customHeader"><?php echo get_post_meta($post->ID, 'customHeader', true); ?></textarea> <p>Enter your custom html code here for the post page header/image area. Whatever you enter here will override the default post header or image listing <b>for this post only</b>. You can enter image references like so <img src='wp-content/uploads/product1.jpg' />. To show default images, just leave this field empty</p> </div> <?php } //Adds the custom post title box function custom_post_title() { global $post; ?> <div class="inside"> <p><input style="height:25px;width:100%;margin-left:-10px;" type="text" name="customTitle" id="customTitle" value="<?php echo get_post_meta($post->ID, 'customTitle', true); ?>"></p> <p>Enter your custom post/page title here and it will be used for the html <title> for this post page and the Google link text used for this page.</p> </div> <?php } add_action('save_post', 'custom_add_save'); function custom_add_save($postID){ if (!defined('DOING_AUTOSAVE') && !DOING_AUTOSAVE) { return $postID; } else { // called after a post or page is saved and not on autosave if($parent_id = wp_is_post_revision($postID)) { $postID = $parent_id; } if ($_POST['customHeader']) { update_custom_meta($postID, $_POST['customHeader'], 'customHeader'); } else { update_custom_meta($postID, '', 'customHeader'); } if ($_POST['customTitle']) { update_custom_meta($postID, $_POST['customTitle'], 'customTitle'); } else { update_custom_meta($postID, '', 'customTitle'); } } } function update_custom_meta($postID, $newvalue, $field_name) { // To create new meta if(!get_post_meta($postID, $field_name)){ add_post_meta($postID, $field_name, $newvalue); }else{ // or to update existing meta update_post_meta($postID, $field_name, $newvalue); } } ?>
Автоматическая система сохранения WordPress вполне может быть вашей проблемой, так как я думаю, что пользовательские поля не передаются для автоматических сбережений (поэтому ваши customTitle
переменные customHeader
и customTitle
будут пустыми во время автоматического сохранения).
В вашей функции сохранения вы должны проверить, установлена ли константа DOING_AUTOSAVE
(это, по-видимому, предпочтительнее проверки действия post), и верните, если это так. Что-то вроде этого:
if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return;
См. Этот билет для получения дополнительной информации: http://core.trac.wordpress.org/ticket/10744
WordPress Codex имеет ссылку на функцию add_meta_box () , с большим примером.
И да, он использует
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) return $post_id;
и я думаю, что вы внедрили это правильно.
FYI, решение, размещенное здесь http://wordpress.org/support/topic/custom-post-type-information-disappearing, работало для меня, и я думаю, что это намного элегантнее.