Possibilité de désactiver l'enregistrement automatique pour le type de publication personnalisé unique

10

J'ai donc un problème avec mes champs personnalisés dans mon type de message personnalisé. Pour une raison quelconque, les champs sont enregistrés puis effacés de manière quelque peu aléatoire ... Je suis sûr que ce n'est pas aléatoire, mais je ne sais pas ce qui déclenche cela. Voici le code de mon type de publication personnalisé:

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

Mise à jour: J'ai donc fait plus de recherches et je l'ai compris. Enregistrement automatique (alias révisions) - Les métadonnées de publication se suppriment

Est-il possible de désactiver l'enregistrement automatique pour un seul type de publication et non globalement?

Marc
la source
2
avez-vous modifié le code que vous avez publié ci-dessus? Parce que vous n'en avez pas revisionsdans le supportstableau, les sauvegardes automatiques doivent être désactivées pour votre type de publication "Givings"
onetrickpony

Réponses:

17

C'est facile :)

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' );
}
kovshenin
la source
Pas entièrement propre. Ce script est nécessaire si vous voulez que post.js fasse des aperçus de permalien dans la ligne sous l'entrée de titre. Cela est particulièrement visible sur les nouveaux messages, car la ligne de permalien reste invisible sans sauvegarde automatique. Une solution de contournement serait de mettre en file d'attente un script qui stubs dans les objets et fonctions essentiels de autosave.js.
kitchin
4

Apparemment, le désenregistrement du javascript d'enregistrement automatique arrêtera essentiellement l'exécution de la routine d'enregistrement automatique. Cela ne désactivera pas nécessairement la possibilité pour les enregistrements automatiques de se produire sur ce type de publication, mais cela arrêtera l'exécution du script d'enregistrement automatique natif.

Ce n'est pas une solution parfaite mais elle devrait avoir l'effet souhaité.

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

J'espère que ça t'as aidé...

EDIT: Avec le code ci-dessus, lorsque sur l'écran de création de poste pour ce type, vous devriez voir ce qui suit dans la source de la page.

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

Les variables ne sont pas ce que nous regardons ici, c'est le script en bas, notez que src ne pointe maintenant nulle part (cela pointait à l'origine vers le fichier autosave.js).

Voyez-vous quelque chose de similaire à ce qui précède, ou le src est-il toujours écrit avec le chemin d'accès au fichier autosave.js?

EDIT2: C'est ce que je vois avec les scripts concaténés désactivés.

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

Notez que le script d'enregistrement automatique est toujours exclu .. (jusqu'à présent, je ne suis pas en mesure de reproduire votre problème) ..

Où placez-vous le code que j'ai fourni?

t31os
la source
Merci!! Est-il possible d'y mettre plusieurs types de messages? Ou dois-je le faire pour chaque CPT?
Marc
La honte. Cela n'a pas fonctionné pour un seul cpt. J'obtiens toujours ceci: cl.ly/3gTR - qui efface les champs personnalisés.
Marc
Vérifiez la source de la page et voyez si le fichier autosave.js est toujours là, s'il est toujours là, alors le filtre ne fonctionne pas comme prévu (ou il me manque quelque chose). MODIFICATION RAPIDE: Semble fonctionner pour moi Très bien, vous êtes-vous souvenu de changer le texte de l'exemple de code pour qu'il corresponde à votre type de message?
t31os
Ouais, je vais réessayer et regarder la source. Et si je veux faire plusieurs types de messages?
Marc
1
Vous avez dit que ce n'était pas une solution parfaite, mais ce n'était même pas une bonne solution :)
kovshenin
1

J'ai juste eu un problème avec cela sur l'un des plugins que je maintiens, et nous avons décidé de vérifier simplement si nous étions sur nos pages (produit wpsc et non sur la publication ou la page), puis nous avons simplement désenregistré le script d'enregistrement automatique, donc, , out CPT est 'wpsc-product' et notre fonction (supprimer le code non apparenté ressemble à ceci:

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
la source
Veuillez ne pas désenregistrer les scripts de base.
kovshenin