Możliwe jest wyłączenie autozapisu dla pojedynczego niestandardowego typu postu

10

Mam problem z niestandardowymi polami w niestandardowym typie postu. Z jakiegokolwiek powodu pola zapisują, a następnie usuwają nieco losowo ... Jestem pewien, że to nie jest przypadkowe, ale nie jestem pewien, co to powoduje. Oto kod mojego niestandardowego typu posta:

    // 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];
}

Aktualizacja: Więc zrobiłem więcej badań i wymyśliłem to. Automatyczne zapisywanie (inaczej Wersje) - Metadane po usuwają się

Czy można wyłączyć automatyczne zapisywanie tylko dla jednego typu postu, a nie globalnie?

Marc
źródło
2
czy edytowałeś kod, który opublikowałeś powyżej? Ponieważ nie masz go revisionsw supportstablicy, więc automatyczne zapisywanie powinno być wyłączone dla typu postu „Dawanie”
onetrickpony

Odpowiedzi:

17

To łatwe :)

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' );
}
koshenin
źródło
Nie do końca czyste. Ten skrypt jest potrzebny, jeśli chcesz, aby post.js wykonywał podglądy łącza bezpośredniego w wierszu pod wpisem tytułu. Jest to szczególnie widoczne na nowych postach, ponieważ linia bezpośredniego łącza jest niewidoczna bez automatycznego zapisywania. Obejściem może być kolejkowanie skryptu, który umieszcza podstawowe obiekty i funkcje pliku autosave.js.
kitchin
4

Najwyraźniej wyrejestrowanie javascript z autozapisaniem zasadniczo zatrzyma działanie procedury autozapisu. Niekoniecznie wyłącza to możliwość automatycznego zapisywania tego typu postów, ale zatrzyma działanie natywnego skryptu autozapisu.

To nie jest idealne rozwiązanie, ale powinno mieć pożądany efekt.

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 );

Mam nadzieję, że pomoże ...

EDYCJA: Z powyższym kodem, gdy na ekranie tworzenia postu dla tego typu powinieneś zobaczyć następujące informacje w źródle strony.

<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>

Zmienne nie są tym, na co patrzymy tutaj, to skrypt na dole, zauważ, że src teraz nie wskazuje nigdzie (pierwotnie wskazywał na plik autosave.js).

Czy widzisz coś podobnego do powyższego, czy też src wciąż jest zapisywany ze ścieżką do pliku autosave.js?

EDIT2: To właśnie widzę przy wyłączonych skryptach konkatenacji.

<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>

Zauważ, że skrypt autozapisu jest nadal wykluczony .. (jak dotąd nie jestem w stanie odtworzyć twojego problemu) ..

Gdzie umieszczasz kod, który podałem?

t31os
źródło
Dzięki!! Czy można tam umieścić wiele typów postów? Czy muszę to robić dla każdego CPT?
Marc
Wstyd. Nie działało to dla jednego kpt. Nadal otrzymuję to: cl.ly/3gTR - co czyści niestandardowe pola.
Marc
Sprawdź źródło strony i sprawdź, czy plik autosave.js nadal tam jest, jeśli nadal tam jest, to filtr nie działa zgodnie z oczekiwaniami (lub czegoś mi brakuje). SZYBKA EDYCJA: Wydaje się, że działa dla mnie dobrze, czy pamiętasz, aby zmienić tekst w przykładowym kodzie, aby pasował do typu posta?
t31os
Tak, spróbuję jeszcze raz i spojrzę na źródło. A jeśli chcę robić wiele typów postów?
Marc
1
Powiedziałeś, że to nie jest idealne rozwiązanie, ale nie jest to nawet dobre rozwiązanie :)
kovshenin,
1

Właśnie miałem problem z jedną z obsługiwanych przeze mnie wtyczek i postanowiliśmy po prostu sprawdzić, czy jesteśmy na naszych stronach (produkt wpsc, a nie na postie lub stronie), a następnie po prostu wyrejestrowaliśmy skrypt autozapisu, więc, , nasz CPT to „wpsc-product”, a nasza funkcja (usunięcie niepowiązanego kodu wygląda mniej więcej tak:

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' );
fuxia
źródło
Proszę nie wyrejestrowywać podstawowych skryptów.
kovshenin