web-dev-qa-db-fra.com

Est-il possible de définir des champs personnalisés par défaut lors de la création d'une publication?

Lorsque je crée un nouveau message, juste après avoir cliqué sur "Ajouter un nouveau" , lorsque l'éditeur de publication montre, au lieu de devoir utiliser le menu déroulant et de choisir un champ personnalisé à utiliser, j'aimerais avoir certains paramètres par défaut. les entrées de champ personnalisées sont déjà ouvertes.

Visuellement, au lieu de:

enter image description here

J'aimerais avoir quelque chose comme:

enter image description here

Je sais qu'il existe des plugins pour cela (CPT, Plus de champs, etc.), mais j'aimerais un moyen simple de le faire avec une fonction de base.

J'ai essayé quelque chose comme ceci (j'utilise un type de produit personnalisé):

function register_custom_fields( $post_ID ) {

    global $wpdb;

        if( !wp_is_post_revision( $post_ID ) ) {

            add_post_meta( $post_ID, 'reference', '', true);
            add_post_meta( $post_ID, 'price', '', true);

        }

}

add_action('edit_product', 'register_custom_fields');

Mais cela ne semble pas fonctionner. Je pense que le hook est probablement faux (parce que edit_post vient après une mise à jour), mais je ne vois pas de hook pour "nouveau message" (juste après que l'utilisateur clique sur "nouveau message" dans l'administrateur de wp). Y a-t-il ?

Ou peut-être que l'idée est fausse et qu'il existe un autre moyen?

10
mike23

Le hook d’action save_post est appelé lors de la sauvegarde, mais je ne sais pas si vous pouvez ajouter des métadonnées à ce stade. Mais il devrait être possible de créer/mettre à jour vos métadonnées après l'enregistrement de la publication avec l'action hook updated_post_meta.

MODIFIER

Pour présélectionner certains méta-champs (champs personnalisés) sur l'écran de post-création, vous devez d'abord ajouter ces méta-valeurs avec une valeur vide.

Si vous examinez la fonction post_custom_meta_box() (qui est le rappel pour le métabox utilisé postcustom) dans le fichier wp-admin/includes/meta-boxes.php, vous constaterez que la fonction utilise list_meta() pour créer les champs méta présélectionnés.

Regardons maintenant le déroulement du programme jusqu'à ce que cette metabox soit affichée (Nous recherchons un hook action/filtre que nous pouvons utiliser ici):

  1. WordPress charge le fichier post-new.php
  2. Ce fichier génère une publication par défaut dans la base de données sur la ligne 39 avec la fonction get_default_post_to_edit(). C'est bien. En gros, la publication est déjà dans la base de données en tant que brouillon automatique. Malheureusement, il n’ya actuellement aucun moyen de modifier ces données ou d’ajouter quelque chose de nouveau.
  3. À l’étape suivante, le fichier edit-form-advaned.php est inclus. Ce fichier générera la page d'administration de trou et comprend toutes les métaboxes requises en fonction du paramètre supports du type de publication.
  4. Sur la ligne 136, les champs personnalisés metabox postcustom sont inclus et la fonction ci-dessus est appelée. Encore une fois, pas de crochet d’action que nous pourrions utiliser.

Conclusion

Je pense que la seule façon de faire est d’utiliser jQuery ou de surcharger le métabox postcustom et d’ajouter les méta-valeurs avant d’exécuter la fonction list_meta().

Par exemple.

add_action('admin_menu', 'wpse29358_replaceMetaBoxes'); // maybe add_meta_boxes hook
function wpse29358_replaceMetaBoxes() {
    remove_meta_box('postcustom', {POST_TYPE}, 'normal');
    add_meta_box('postcustom', __('Custom Fields'), 'wpse29358_postcustomMetabox', {POST_TYPE}, 'normal', 'core');
}

function wpse29358_postcustomMetabox($post) {
    // Add your meta data to the post with the ID $post->ID
    add_post_meta($post->ID, 'key', 'value');

    // and then copy&past the metabox content from the function post_custom_meta_box()
}
8
rofflox

C'est la méthode appropriée pour ajouter la prise en charge des champs personnalisés (vous n'obtenez pas les champs vides lorsque vous modifiez des publications).

function set_default_meta($post_ID){
    $current_field_value = get_post_meta($post_ID,'Sort Order',true);
    $default_meta = '100'; // value
    if ($current_field_value == '' && !wp_is_post_revision($post_ID)){
            add_post_meta($post_ID,'Sort Order',$default_meta,true);
    }
    return $post_ID;
}
add_action('wp_insert_post','set_default_meta');
3
Yuri Korolov

Je souhaite disposer d'une méta description unique pour chaque publication personnalisée sur un site WP que je suis en train de développer. Donc, je cherchais aussi un champ personnalisé par défaut et atterris ici.

Je sais que c'est un très vieux billet, mais je pensais poster la réponse simple que j'ai trouvée sur mariokostelac.com .

kg est mon espace de noms, vous pouvez nommer la fonction comme vous le souhaitez. Je suis assez nouveau pour les crochets et la WP personnalisation en général, mais je pense que wp_insert_post est le crochet que vous recherchez.

add_action('wp_insert_post', 'kg_set_default_custom_fields');

function kg_set_default_custom_fields($post_id)
{
    if ( $_GET['post_type'] != 'page' ) {
        add_post_meta($post_id, 'meta-description', '', true);
    }

    return true;
}
1
kaplan

Vous devez utiliser l'action save_post et isoler votre opération en vérifiant le type de publication car il est exécuté sur tous les types de publication. De toute évidence, vous devrez intégrer plus de logique pour que cela fonctionne pour vous. Vous devriez probablement définir un champ de méta de publication qui vérifie si vous avez défini les valeurs par défaut une fois pour que vos utilisateurs ne soient pas frustrés s'ils souhaitent laisser un champ de méta de publication vide.

Si vous souhaitez que les valeurs par défaut soient nulles (comme indiqué dans votre exemple de code), ne créez pas de fonction, car cela ne ferait qu'ajouter une surcharge et les champs méta de publication ne sont pas renseignés avec des valeurs par défaut.

function register_custom_fields( $post_ID ) {
    //Do nonce checking here
    if( !wp_is_post_revision( $post_ID ) ) {
        if('product' === $_REQUEST['post_type']){
            $reference = $_REQUEST['reference'] ? esc_html($_REQUEST['reference']) : 'default_value';
            $price = $_REQUEST['price'] ? esc_html($_REQUEST['price']) : 'default_value';
            update_post_meta( $post_ID, 'reference', $reference);
            update_post_meta( $post_ID, 'price', $price);
        }
    }
}
add_action('save_post', 'register_custom_fields');
1
Brian Fegter