Можно отключить автосохранение для одного пользовательского типа записи

10

Поэтому у меня возникла проблема с моими настраиваемыми полями в моем типе записи. По какой-то причине поля сохраняются, а затем очищаются случайным образом ... Я уверен, что это не случайно, но я не уверен, что вызывает это. Вот код для моего пользовательского типа сообщения:

    // Custom Post Type: Strategic Giving
add_action('init', 'giving_register');

function giving_register() {

  $labels = array(
    'name' => _x('Invest Items', 'post type general name'),
    'singular_name' => _x('Item', 'post type singular name'),
    'add_new' => _x('Add New', 'giving item'),
    'add_new_item' => __('Add New Item'),
    'edit_item' => __('Edit Item'),
    'new_item' => __('New Item'),
    'view_item' => __('View Item'),
    'search_items' => __('Search Items'),
    'not_found' =>  __('Nothing found'),
    'not_found_in_trash' => __('Nothing found in Trash'),
    'parent_item_colon' => ''
    );

  $args = array(
    'labels' => $labels,
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true,
    'query_var' => true,
    'menu_icon' => get_stylesheet_directory_uri() . '/images/cpt-giving.png',
    'rewrite' => array( 'slug' => 'giving_items' ),
    'capability_type' => 'post',
    'hierarchical' => true,
    'menu_position' => null,
    'supports' => array('title','thumbnail','editor'),
    'paged' => false,
    ); 

  register_post_type( 'givings' , $args );
}

register_post_type( 'givings' , $args );

add_action("admin_init", "giving_admin_init");

function giving_admin_init(){
  add_meta_box("giving_info-meta", "Item Options", "giving_info", "givings", "side", "high");
}

function giving_info(){
  global $post;
  $custom = get_post_custom($post->ID);
  $amount = $custom["amount"][0];
  $monthly = $custom["monthly"][0];
  $user_entered_value = $custom["user_entered_value"][0];
  $item_name = $custom["item_name"][0];
  $special = $custom["special"][0];
  ?>
  <div style="text-align: right;">
    <p>
      <label for="amount"><strong>Amount:</strong></label>  
      <input style="width: 180px" type="text" name="amount" id="amount" value="<?php echo $amount; ?>" />
      <em>Example: 30.00</em>
    </p>
    <p>
      <label for="monthly"><strong>Monthly?</strong></label>  
      <?php if ($monthly == 'on') { ?>
        <input type="checkbox" name="monthly" id="monthly" checked="checked" />
      <?php } else { ?>
        <input type="checkbox" name="monthly" id="monthly" />
      <?php } ?>      
    </p>
    <p>
      <label for="special"><strong>Special Item?</strong></label>  
      <?php if ($special == 'on') { ?>
        <input type="checkbox" name="special" id="special" checked="checked" />
      <?php } else { ?>
        <input type="checkbox" name="special" id="special" />
      <?php } ?>      
    </p>
    <p>
      <label for="user_entered_value"><strong>Allow Giver To Enter Custom Value?</strong></label>  
      <?php if ($user_entered_value == 'on') { ?>
        <input type="checkbox" name="user_entered_value" id="user_entered_value" checked="checked" />
      <?php } else { ?>
        <input type="checkbox" name="user_entered_value" id="user_entered_value" />
      <?php } ?>      
    </p>
    <p>
      <label for="item_name"><strong>Item Name:</strong></label>              
      <input style="width: 180px" type="text" name="item_name" id="item_name" value="<?php echo $item_name; ?>" /><br />
      If item is a <em>per item</em> then enter the name of the singular item. <em>Example: Chair - which will be displayed as "30.00 per Chair"</em>
    </p>
    <p style="text-align: left;">
      Strategic Giving photo must be horizontal and uploaded/set as the <strong>Featured Image</strong> (see below).
      <em>Do not add photo to content area.</em>
    </p>
  </div>
  <?php }  

add_action('save_post', 'giving_save_details_amount');
add_action('save_post', 'giving_save_details_monthly');
add_action('save_post', 'giving_save_details_user_entered_value');
add_action('save_post', 'giving_save_details_item_name');
add_action('save_post', 'giving_save_details_special');

function giving_save_details_amount(){
  global $post;
  update_post_meta($post->ID, "amount", $_POST["amount"]);
}

function giving_save_details_monthly(){
  global $post;
  update_post_meta($post->ID, "monthly", $_POST["monthly"]);
}

function giving_save_details_user_entered_value(){
  global $post;
  update_post_meta($post->ID, "user_entered_value", $_POST["user_entered_value"]);
}

function giving_save_details_item_name(){
  global $post;
  update_post_meta($post->ID, "item_name", $_POST["item_name"]);
}

function giving_save_details_special(){
  global $post;
  update_post_meta($post->ID, "special", $_POST["special"]);
}

add_action("manage_pages_custom_column",  "givings_custom_columns");
add_filter("manage_edit-givings_columns", "givings_edit_columns");

function givings_edit_columns($columns){
  $columns = array(
    "cb" => "<input type=\"checkbox\" />",
    "title" => "Strategic Giving Item",
    "amount" => "Amount",
    "monthly" => "Monthly",
    "special" => "Special Item",
    "giving_image" => "Image"
    );

  return $columns;
}

function givings_custom_columns($column){
  global $post;

  switch ($column) {
    case "amount":
    $custom = get_post_custom();
    echo $custom["amount"][0];
    break;

    case "monthly":
    $custom = get_post_custom();
    $is_monthly = $custom["monthly"][0];
    if ($is_monthly == "on") {
      echo "Yes";
    };
    break;

    case "special":
    $custom = get_post_custom();
    $is_special = $custom["special"][0];
    if ($is_special == "on") {
      echo "Yes";
    };
    break;

    case "giving_image":
      echo get_the_post_thumbnail(NULL, 'staff_admin');
    break;
  }
}

function giving_amount(){
  $custom = get_post_custom();
  return $custom["amount"][0];
}

function giving_monthly(){
  $custom = get_post_custom();
  return $custom["monthly"][0];
}

function giving_special(){
  $custom = get_post_custom();
  return $custom["special"][0];
}

function giving_user_entered_value(){
  $custom = get_post_custom();
  return $custom["user_entered_value"][0];
}

function giving_item_name(){
  $custom = get_post_custom();
  return $custom["item_name"][0];
}

Обновление: так что я провел больше исследований и выяснил это. Автосохранение (он же редакция) - метаданные поста удаляются

Можно ли отключить автосохранение только для одного типа сообщений, а не глобально?

Марк
источник
2
Вы редактировали код, который вы разместили выше? Поскольку у вас нет revisionsэтого supportsмассива, поэтому автосохранения должны быть отключены для вашего типа
постов

Ответы:

17

Это легко :)

add_action( 'admin_enqueue_scripts', 'my_admin_enqueue_scripts' );
function my_admin_enqueue_scripts() {
    if ( 'your_post_type' == get_post_type() )
        wp_dequeue_script( 'autosave' );
}
КОВШЕНИН
источник
Не совсем чисто. Этот скрипт необходим, если вы хотите, чтобы post.js делал предварительные ссылки на постоянные ссылки в строке под заголовком. Это особенно заметно на новых сообщениях, поскольку постоянная ссылка остается невидимой без автосохранения. Обходной путь может заключаться в том, чтобы поставить скрипт в тупик в основных объектах и ​​функциях autosave.js.
Китчин
4

По-видимому, отмена автосохранения JavaScript по существу остановит выполнение процедуры автосохранения. Это не обязательно отключит возможность автоматического сохранения для этого типа записи, но остановит выполнение собственного сценария автосохранения.

Это не идеальное решение, но оно должно иметь желаемый эффект.

function wpse5584_kill_autosave_on_postype( $src, $handle ) {
    global $typenow;
    if( 'autosave' != $handle || $typenow != 'your-post-type-here' )
        return $src;
    return '';
}
add_filter( 'script_loader_src', 'wpse5584_kill_autosave_on_postype', 10, 2 );

Надеюсь, это поможет...

РЕДАКТИРОВАТЬ: С помощью приведенного выше кода, когда на экране создания поста для этого типа вы должны увидеть следующее в источнике страницы.

<script type='text/javascript'>
/* <![CDATA[ */
var autosaveL10n = {
    autosaveInterval: "60",
    previewPageText: "Preview this Page",
    previewPostText: "Preview this Post",
    requestFile: "http://yoursite/wp-admin/admin-ajax.php",
    savingText: "Saving Draft&#8230;",
    saveAlert: "The changes you made will be lost if you navigate away from this page."
};
try{convertEntities(autosaveL10n);}catch(e){};
/* ]]> */
</script>
<script type='text/javascript' src=''></script>

Переменные - это не то, что мы здесь видим, это скрипт внизу, обратите внимание, что src теперь нигде не указывает (изначально он указывал на файл autosave.js).

Вы видите что-то похожее на приведенное выше, или src все еще пишется с путем к файлу autosave.js?

РЕДАКТИРОВАТЬ 2: Это то, что я вижу с объединенными сценариями.

<script type='text/javascript' src='http://example/wp-admin/load-scripts.php?c=0&amp;load=hoverIntent,common,jquery-color,schedule,wp-ajax-response,suggest,wp-lists,jquery-ui-core,jquery-ui-sortable,postbox,post,word-count,thickbox,media-upload&amp;ver=e1039729e12ab87705c047de01b94e73'></script>

Обратите внимание, что сценарий автосохранения по-прежнему исключается .. (пока что я не могу воспроизвести вашу проблему) ..

Где вы размещаете код, который я предоставил?

t31os
источник
Спасибо!! Можно ли разместить там несколько типов постов? Или я должен сделать это для каждого CPT?
Марк
Позор. Это не сработало ни на один пункт. Я все еще получаю это: cl.ly/3gTR - который очищает пользовательские поля.
Марк
Проверьте источник страницы и посмотрите, есть ли там файл autosave.js, если он все еще там, то фильтр не работает должным образом (или я что-то упустил) .. БЫСТРОЕ РЕДАКТИРОВАНИЕ: Кажется, работает для меня просто отлично, вы помните, чтобы изменить текст в примере кода, чтобы соответствовать вашему типу сообщения?
t31os
Да, я попробую еще раз и посмотрю на источник. А что если я хочу сделать несколько типов постов?
Марк
1
Вы сказали, что это не идеальное решение, но это даже не хорошее решение :)
Ковшенин
1

У меня просто была проблема с этим на одном из поддерживаемых мной плагинов, и мы решили просто проверить, были ли мы на наших страницах (wpsc-product, а не на post или page), а затем мы просто отменили сценарий автосохранения, так что out CPT - это «wpsc-product» и наша функция (удаление несвязанного кода выглядит примерно так:

function admin_include_css_and_js_refac( $pagehook ) {
    global $post_type, $current_screen;
    if($post_type == 'wpsc-product' )
    wp_deregister_script( 'autosave' );         
}
add_action( 'admin_enqueue_scripts', 'admin_include_css_and_js_refac' );
Фуксия
источник
Пожалуйста, не отменяйте основные скрипты.
Ковшенин