web-dev-qa-db-fra.com

Stockage des révisions de métadonnées pour un type de publication personnalisé

Stocker des métadonnées pour les types de publication personnalisés est facile, il vous suffit d’ajouter une action pour "save_post" avec votre méthode qui la gère. Dans lequel vous avez alors quelque chose comme ceci pour un champ que vous voulez stocker (avec les contrôles de sécurité habituels bien sûr):

update_post_meta( $post_id, '_description', $_POST['_description'] );

Assez simple. Cependant, je ne peux pas comprendre ce que je dois faire pour que WordPress enregistre les révisions d'une publication personnalisée.

Les révisions sont activées pour le type d'article personnalisé et les révisions fonctionnent pour les champs standard tels que 'title'. Mais cela ne fonctionne pas par défaut pour les métadonnées.

J'ai cherché comment d'autres personnes font cela et presque toutes ont donné l'extrait de code suivant:

function my_plugin_save_post( $post_id, $post ) {

    if ( $parent_id = wp_is_post_revision( $post_id ) ) {

        $parent  = get_post( $parent_id );
        $my_meta = get_post_meta( $parent->ID, 'my_meta', true );

        if ( false !== $my_meta )
              add_metadata( 'my_custom_post', $post_id, 'my_meta', $my_meta );
    }

} add_action( 'save_post', 'my_plugin_save_post' );

Mais ça ne marche pas pour moi. Je ne vois pas de nouvelle révision dans la liste des révisions lorsque je modifie l'un des champs de métadonnées. Je vois une nouvelle révision lorsque je change, par exemple, le titre de l'article personnalisé.

Soit je ne connais pas certains détails de la procédure à suivre par rapport à la manière dont je stocke habituellement les métadonnées (en raison de la méconnaissance de cette partie de l'API ou des structures de données). Ou je manque quelque chose à cause de ce froid que j'ai.

Quelqu'un at-il un bon exemple de ce que vous devez faire pour stocker les révisions pour les métadonnées de publication personnalisées?

6
FuzzyYoda

Il existe un filtre privé auquel vous pouvez (mais ne devriez pas) accéder:

Défini dans wp-includes/revision.php :

/**
 * Filter the list of fields saved in post revisions.
 *
 * Included by default: 'post_title', 'post_content' and 'post_excerpt'.
 *
 * Disallowed fields: 'ID', 'post_name', 'post_parent', 'post_date',
 * 'post_date_gmt', 'post_status', 'post_type', 'comment_count',
 * and 'post_author'.
 *
 * @since 2.6.0
 * @since 4.5.0 The `$post` parameter was added.
 *
 * @param array $fields List of fields to revision. Contains 'post_title',
 *                      'post_content', and 'post_excerpt' by default.
 * @param array $post   A post array being processed for insertion as a post revision.
 */
$fields = apply_filters( '_wp_post_revision_fields', $fields, $post );

Donc, vous pourriez écrire une fonction comme

add_filter( '_wp_post_revision_fields', 'add_my_own_fields', 10, 2 );

function add_my_own_fields( $fields, $post ) {
    $fields['meta_field'] = 'Meta Field';
}

meta_field est la clé de votre méta que vous souhaitez réviser et 'Meta Field' est ce qui s'affiche en tant qu'en-tête dans l'interface utilisateur des révisions.

S'il vous plaît notez que ceci est privé et que son utilisation est pas destinée aux développeurs de thèmes ou de plugins. Des solutions plus élaborées seraient nécessaires pour éviter ce problème et il serait peut-être préférable de disposer d'un plug-in capable de gérer ces problèmes.

1
phatskat