Existe-t-il un moyen de définir des champs personnalisés par défaut lors de la création d'une publication?

11

Lorsque je crée un nouveau message, juste après avoir cliqué sur "Ajouter un nouveau" , lorsque l'éditeur de message s'affiche, au lieu d'avoir à utiliser le menu déroulant et à choisir un champ personnalisé à utiliser, j'aimerais avoir déjà des entrées de champ personnalisé par défaut extrémité ouverte.

Visuellement, au lieu de:

entrez la description de l'image ici

J'aimerais avoir quelque chose comme:

entrez la description de l'image ici

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

J'ai essayé quelque chose comme ça (j'utilise un «produit» de type de message 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 (car edit_postvient après une mise à jour), mais je ne vois aucun hook pour "new post" (juste après que l'utilisateur clique sur "new post" dans wp admin). Y a-t-il ?

Ou peut-être que l'idée est fausse et qu'il y a une autre façon?

mike23
la source

Réponses:

9

Le crochet d'action save_postest appelé lors de la sauvegarde, mais je ne sais pas si vous pouvez ajouter des métadonnées pour le moment. Mais il devrait être possible de créer / mettre à jour vos métadonnées après que la publication a été enregistrée avec le crochet d'action updated_post_meta.

ÉDITER

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

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

Jetons maintenant un œil au flux du programme jusqu'à ce que cette métabox s'affiche (nous recherchons un crochet d'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 en ligne 39avec la fonction get_default_post_to_edit(). C'est zonte. Fondamentalement, le message est déjà dans la base de données en tant que brouillon automatique. Malheureusement, il n'y a aucun crochet pour le moment pour modifier ces données ou ajouter quelque chose de nouveau.
  3. À l'étape suivante, le fichier edit-form-advaned.phpest inclus. Ce fichier générera la page d'administration du trou et comprend toutes les métaboxes requises en fonction du supportsparamètre du type de publication.
  4. En ligne, 136la métabox des champs personnalisés postcustomest incluse et la fonction ci-dessus est appelée. Encore une fois, aucun crochet d'action que nous pourrions utiliser.

Conclusion

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

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()
}
rofflox
la source
Le problème est que je n'essaie pas d'ajouter quoi que ce soit sur la sauvegarde pour l'instant, j'essaie de montrer certaines entrées de champ personnalisées déjà ouvertes lorsque l'utilisateur arrive sur la page d'édition (voir les mises à jour avec captures d'écran)
mike23
Ah. Maintenant je comprends votre problème. J'ai édité ma réponse.
rofflox
3

C'est la bonne méthode pour ajouter la prise en charge des champs personnalisés (vous n'obtenez pas les champs vides lors de la modification des messages)

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');
Yuri Korolov
la source
1

Vous devez utiliser l'action save_post et isoler votre opération en vérifiant le type de publication car elle s'exécute sur tous les types de publication. Il y a évidemment plus de logique que vous devrez intégrer à cela pour que cela fonctionne pour vous. Vous devriez probablement définir un post-méta-champ qui vérifie si vous avez défini les valeurs par défaut une fois afin que vos utilisateurs ne soient pas frustrés s'ils souhaitent laisser un post-méta-champ vide.

Si vous souhaitez que les valeurs par défaut soient nulles (comme illustré dans votre exemple de code), ne créez pas de fonction, car cela ajoute simplement des frais généraux et les champs de métadonnées ne sont pas remplis de 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');
Brian Fegter
la source
1

Je cherche à avoir une méta description unique pour chaque publication personnalisée sur un site WP que je développe. Je cherchais donc également un champ personnalisé par défaut et j'ai atterri ici.

Je sais que c'est un assez vieux post, mais je pensais que je posterais 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 dans les hooks et la personnalisation de WP en général, mais je pense que wp_insert_post est le hook 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;
}
kaplan
la source
FYI: Il y a get_post_type(). En outre, lorsque vous effectuez une comparaison lâche, vous devez utiliser la syntaxe de condition de style YODA.
kaiser
@kaiser que voulez-vous dire avec le style YODA? Aussi pourquoi est-il get_post_type($post_id) meilleur que $_GET['post_type']?
Aziz
1
Utilisez la valeur avant la comparaison: 'page' === $_GET['post_type']. Sinon, lorsque vous oubliez un seul, =vous pourriez vous retrouver dans une situation où vous attribuez une valeur au lieu de comparer deux valeurs. Et cela finira comme une poubelle dans votre base de données. Vous pouvez également utiliser la comparaison === sécurisée de type (la valeur page? Et la valeur de type string?)
kaiser
1
Je vois @kasier - est donc quelque chose comme le code final: 'page' === get_post_type($post_id) ?
Aziz
-1

si quelqu'un a besoin de prendre un champ personnalisé par type de message, je laisse le code ci-dessous comme je l'ai fait et fonctionne bien pour moi :)

function awh_field_type($post_id){
$awh_f_post = get_post_type($post_id);
$meta_value = '';
$meta_name = 'custom';
    if($awh_f_post == 'product'){
        add_post_meta($post_id,$meta_name,$meta_value,true);
    }
return $awh_f_post;

} add_action ('wp_insert_post', 'awh_field_type');

Edgardo Aleman
la source