Die automatische Speicherung kann für einen einzelnen benutzerdefinierten Beitragstyp deaktiviert werden

10

Ich habe also ein Problem mit meinen benutzerdefinierten Feldern in meinem benutzerdefinierten Beitragstyp. Aus welchem ​​Grund auch immer, die Felder werden gespeichert und dann zufällig gelöscht ... Ich bin sicher, dass es nicht zufällig ist, aber ich bin nicht sicher, was dies auslöst. Hier ist der Code für meinen benutzerdefinierten Beitragstyp:

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

Update: Also habe ich mehr recherchiert und es herausgefunden. Automatisch speichern (auch bekannt als Revisionen) - Post-Metadaten löschen sich von selbst

Ist es möglich, die automatische Speicherung nur für einen einzelnen Beitragstyp und nicht global zu deaktivieren?

Marc
quelle
2
Haben Sie den oben veröffentlichten Code bearbeitet? Da Sie nicht revisionsim supportsArray haben, sollten Autosaves für Ihren Beitragstyp "Givings" deaktiviert sein
onetrickpony

Antworten:

17

Das ist einfach :)

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
quelle
Nicht ganz sauber. Dieses Skript wird benötigt, wenn post.js eine Permalink-Vorschau in der Zeile unter der Titeleingabe erstellen soll. Dies macht sich insbesondere bei neuen Posts bemerkbar, da die Permalink-Linie ohne automatische Speicherung unsichtbar bleibt. Eine Problemumgehung besteht darin, ein Skript in die Warteschlange zu stellen, das die wesentlichen Objekte und Funktionen von autosave.js blockiert.
Küche
4

Anscheinend wird durch das Abmelden des Autosave-Javascript die Autosave-Routine im Wesentlichen gestoppt. Es wird nicht unbedingt die Fähigkeit zum automatischen Speichern für diesen Beitragstyp deaktivieren, aber es wird die Ausführung des nativen automatischen Speicherskripts stoppen.

Es ist keine perfekte Lösung, sollte aber den gewünschten Effekt haben.

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

Ich hoffe, das hilft...

BEARBEITEN: Mit dem obigen Code sollten Sie auf dem Bildschirm für die Post-Erstellung für diesen Typ Folgendes in der Quelle der Seite sehen.

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

Die Variablen sind nicht das, was wir hier sehen, es ist das Skript unten. Beachten Sie, dass der src jetzt nirgendwo hin zeigt (dies zeigte ursprünglich auf die Datei autosave.js).

Sehen Sie etwas Ähnliches wie oben oder wird der src immer noch mit dem Pfad zur Datei autosave.js geschrieben?

EDIT2: Dies ist, was ich mit verketteten Skripten sehe.

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

Beachten Sie, dass das Autosave-Skript immer noch ausgeschlossen wird. (Bisher kann ich Ihr Problem nicht reproduzieren.)

Wo platzieren Sie den von mir angegebenen Code?

t31os
quelle
Vielen Dank!! Ist es möglich, dort mehrere Beitragstypen einzufügen? Oder muss ich das für jedes CPT tun?
Marc
Schande. Es hat nicht für ein einziges cpt funktioniert. Ich bekomme immer noch folgendes: cl.ly/3gTR - das löscht die benutzerdefinierten Felder.
Marc
Überprüfen Sie die Quelle der Seite und prüfen Sie, ob die Datei autosave.js noch vorhanden ist. Wenn sie noch vorhanden ist, funktioniert der Filter nicht wie erwartet (oder mir fehlt etwas). SCHNELLE BEARBEITUNG: Scheint für mich zu funktionieren Gut, haben Sie daran gedacht, den Text im Beispielcode an Ihren Beitragstyp anzupassen?
t31os
Ja, ich werde es noch einmal versuchen und mir die Quelle ansehen. Und was ist, wenn ich mehrere Beitragstypen erstellen möchte?
Marc
1
Sie sagten, es ist keine perfekte Lösung, aber es ist nicht einmal eine gute Lösung :)
Kovshenin
1

Ich hatte gerade ein Problem damit auf einem der Plugins, die ich verwalte, und wir beschlossen, nur zu überprüfen, ob wir auf unseren Seiten waren (wpsc-Produkt und nicht auf Post oder Seite), und dann haben wir das Autosave-Skript einfach abgemeldet. , out CPT ist 'wpsc-product' und unsere Funktion (das Entfernen von nicht verwandtem Code sieht ungefähr so ​​aus:

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
quelle
Bitte melden Sie Core-Skripte nicht ab.
Kovshenin