2010-03-29 2 views
10

Код ниже работает почти безукоризненно, однако мое значение для названия страницы на одной из моих страниц продолжает оставаться пустой после того, как несколько страниц обновится ... Она немного устает, а затем возвращается к пустой. Я думаю, что у меня должен быть конфликт в коде ниже, но я не могу это понять.Wordpress add_meta_box() weirdness

Я разрешаю пользователю устанавливать пользовательское название страницы для сообщений, а также страниц через пользовательское поле ввода заголовка «пост/страница». Может ли кто-нибудь увидеть очевидную проблему здесь, которая может привести к сбросу заголовка страницы в пустую авто?

// =================== 
// = 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 &lt;img src='wp-content/uploads/product1.jpg' /&gt;. 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 &lt;title&gt; 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); 
    } 
} 
?> 
+0

Возможно, что-то связано с системой автоматического сохранения Wordpress, попробуйте проверить, '' _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ '' '' '' '' '' '' '' '' ''. –

+0

Я не думал об этом Ричарде, но я думаю, что это может быть полезным фактором (даже если название пользовательского сообщения никогда не бывает пустым в таких случаях, когда кажется, что он сбрасывается в пустые. Я не совсем понимаю, как вы предлагаете чтобы проверить автосохранение в блоках if/then. Можете ли вы опубликовать несколько примеров кода? –

ответ

16

Wordpress сохраним системы вполне может быть ваша проблема, как я думаю, что пользовательские поля не передаются по авто экономит (так что ваши customHeader и customTitle разместить переменные будут пустыми во время автоматического сохранения).

В вашей функции сохранения вы должны проверить, установлена ​​ли константа DOING_AUTOSAVE (это s что предпочтительнее проверять действие post) и возвращать, если это так. Что-то вроде этого:

if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return; 

Смотрите этот билет для получения дополнительной информации: http://core.trac.wordpress.org/ticket/10744

+0

Ричард, я все еще немного не понимаю, как это реализовать, но я обновил свой вопрос с помощью переработанного кода. вы посмотрите и дайте мне знать, если это допустимое обходное решение, чтобы избежать пустой метассылки, которая, как представляется, вызывает автоматическое сохранение? –

+0

Да, это выглядит нормально. Хотя вам действительно не нужна ветка вашего состояния, просто проверьте для константы и возврата, если она установлена. –

4

WordPress Codex завела function reference for add_meta_box(), с большим примером.

И да, он использует


if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) 
    return $post_id; 

, и я думаю, что вы реализовали это правильный путь.

+0

Спасибо Jocap. Я благодарен за подтверждение. Ричард М уже отправил информацию по автосохранению, я просто забыл принять его ответ. Он работает безупречно с: –

+0

Приятно слышать, Скотт. Удачи! :) – jocap

0

FYI решение, размещенное здесь http://wordpress.org/support/topic/custom-post-type-information-disappearing, работало для меня, и я думаю, это намного более элегантно.

+2

Ссылки на внешние сайты не являются приемлемыми ответами. Он непознаваем и становится недействительным, если что-то происходит с ссылкой за пределы сайта. Если вы чувствуете необходимость опубликовать ничего, кроме внешней ссылки, пожалуйста, сделайте это комментарий к исходному вопросу, а не ответ. –