J'aimerais ajouter un champ de métadonnées à la publication en cours en fonction d'une case à cocher dans une méta-boîte personnalisée pour pouvoir basculer mon plug-in personnalisé poste par poste.
Pour cela, j'ai codé les choses suivantes
J'ai réussi en 1. Mais j'ai des problèmes avec le numéro 2. J'ai le code suivant pour gérer le paramétrage des métadonnées:
// register action
add_action( 'save_post', 'cl_save_postdata');
/* When the post is saved, saves our custom data */
function cl_save_postdata( $post_id ) {
// check if $post_id is just a revision id and if so get the parent id
if($parent_id = wp_is_post_revision($post_id)){
$post_id = $parent_id;
}
// verify this came from the our screen and with proper authorization,
// because save_post can be triggered at other times
if ( !wp_verify_nonce( EMU2_I18N_DOMAIN, plugin_basename(__FILE__) ) )
return $post_id;
// verify if this is an auto save routine.
// If it is our form has not been submitted, so we dont want to do anything
if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )
return $post_id;
// Check permissions
if ( 'page' == $_POST['post_type'] ) {
if ( !current_user_can( 'edit_page', $post_id ) )
return $post_id;
} else {
if ( !current_user_can( 'edit_post', $post_id ) )
return $post_id;
}
// OK, we're authenticated: we need to find and save the data
if ($_POST['cl-activated']) {
add_post_meta( $post_id, 'cl-activated', true, true) or update_post_meta( $post_id, 'cl-activated', true);
} elseif (get_post_meta ($post_id, 'cl-activated', true)) {
delete_post_meta( $post_id, 'cl-activated');
}
return $cl_is_activated;
}
L'idée de ce code est de définir ou de désélectionner les métadonnées "activées par la clé" en fonction de la valeur de la case à cocher. La forme de la meta box est la suivante:
function cl_generate_inner_box($post, $metabox) {
// Use nonce for verification
wp_nonce_field( plugin_basename(__FILE__), EMU2_I18N_DOMAIN );
// The actual fields for data entry
echo '<label for="cl-activated">';
_e("Activate collect links", EMU2_I18N_DOMAIN );
echo '</label> ';
echo '<input type="checkbox" id="cl-activated" name="cl-activated" value='.$metabox['args']['cl-parameter-name'];
if (get_post_meta($post_id, 'cl-activated', true)==true) {
echo ' checked="checked"';
}
echo ' />';
}
save_post
comme je le fais maintenant, j'ai l'impression qu'elle n'est appelée que lorsque le message est déjà publié. Le premier problème est résolu. J'ai vérifié les crochets de transition fournis par Wordpress. Il me semblait que le hook save_post
devrait être activé lorsque je modifie un article. Cependant, ce qui se passe, c’est qu’il est appelé lorsque je clique sur le bouton nouveau message , mais pas lorsque je sauvegarde ensuite le message en tant que brouillon.
Pour supprimer, j'ai besoin d'un crochet qui me permet d'exécuter une fonction lorsque l'utilisateur a modifié quelque chose sur le message pour voir si ma case personnalisée a été modifiée afin que je puisse mettre à jour les métadonnées du message en conséquence.
Après WP 2.3, vous avez pour tous les statuts un crochet: {$new_status}_{$post->post_type}
Vous pouvez également utiliser ans if pour le statut de hook save_post; un exemple pour post_type post, vous pouvez remplacer ce post par votre post_type ou par défaut sous WP:
public function set_status_private($id, $post) {
if ( is_object($post) &&
'post' === $post->post_type &&
'publish' === $post->post_status
) {
$post->post_status = 'private';
wp_update_post($post);
}
}
J'espère que ceci vous aide.