web-dev-qa-db-fra.com

Désactiver complètement le processus de sauvegarde

J'ai besoin d'un moyen de désactiver complètement le processus de sauvegarde en utilisant un action/filter. Quelque chose qui fonctionne (par exemple :) dans les crochets query, posts_clauses ou wp_insert_post/save_post/update_post.

Jusqu'ici, j'ai seulement essayé de return '';, ce qui me donne une tonne d'erreurs pour les valeurs manquantes pour les parties d'article post dans l'interface utilisateur d'administration.

Cela devrait se produire "en silence", donc aucune erreur ne sera générée lorsque php_error/WP_DEBUG et autres sont définis sur TRUE/On.

Btw: Je pas demande comment désactiver la fonction de sauvegarde automatique.

4
kaiser
function disable_save( $maybe_empty, $postarr ) {
    $maybe_empty = true;

    return $maybe_empty;
}
add_filter( 'wp_insert_post_empty_content', 'disable_save', 999999, 2 );

Dans la mesure où wp_insert_post_empty_content est défini sur true, WordPress pense qu'il n'y a ni titre ni contenu et qu'il arrête de mettre à jour le message.

EDIT: Une variante encore plus courte serait:

add_filter( 'wp_insert_post_empty_content', '__return_true', PHP_INT_MAX -1, 2 );
5
Rob Vermeer

La raison pour laquelle vous recevez des avis d'arrêt des insertions avec le filtre wp_insert_post_empty_content, comme indiqué dans votre commentaire, à l'adresse https://wordpress.stackexchange.com/a/51980/31794 answer, est la suivante: Pour post-new.php, le processus de création automatique doit obtenir un $post->ID à get_default_post_to_edit() et un wp_insert_post(), et utiliser cet identifiant à partir de $ post return. C'est-à-dire que les pages "Ajouter un nouveau message" créent et obtiennent un nouvel "enregistrement de message" à chaque fois.

Malheureusement, wp_insert_post () renvoie 0 si vous arrêtez le processus de sauvegarde au lieu d’un identifiant de publication attendu. En d'autres termes, vous ne pouvez pas arrêter les "brouillons automatiques" avec le filtre "wp_insert_post_empty_content". Et si vous utilisez le filtre, vous devez malheureusement laisser passer "les brouillons automatiques pour éviter la remarque PHP. C'est un très mauvais bug.

Le seul moyen qui me reste de cesser de créer inutilement de nouveaux enregistrements de brouillon automatique et de contourner ce bogue consiste à étendre la classe wpdb avec un plugin db.php Drop-in:

class wpdb_ext extends wpdb
{
  function insert($table, $data, $format = null) {
    if (isset($data['post_status']) && $data['post_status'] === "auto-draft" && ($pa = (int)$data['post_author'])
        && ($id = $this->get_var("SELECT ID FROM $table WHERE post_status = 'auto-draft' AND post_author = $pa LIMIT 1"))){
        //fake insert id and return id of existing auto-draft as base for New post page.
        return $this->insert_id = (int)$id;
    }
    return parent::insert($table, $data, $format = null);//else do actual insert
  }
}
$wpdb = new wpdb_ext(DB_USER, DB_PASSWORD, DB_NAME, DB_Host);//overload wpdb

Cela ne conserve qu'un seul brouillon automatique par auteur et évite inutile de nouveaux enregistrements de brouillon automatique gaspillant/sautant des incréments d'identifiants pour rien.

2
hexalys