web-dev-qa-db-fra.com

Liste des messages dans un champ personnalisé

J'ai une question. J'ai un type de message personnalisé appelé Lieu. J'ai une situation qui peut être mise en place. Je veux avoir un champ personnalisé parent_place où je pourrais choisir un parent de lieu.
Le lieu ne peut avoir aucun parent ou un seul parent.

Est-il possible de répertorier tous les articles (type = place) dans un champ personnalisé et d'en choisir un? Dans les plugins pour les champs personnalisés, je peux choisir une boîte de dépôt, une radio, etc., mais je dois saisir des valeurs. Comment puis-je remplir automatiquement une liste de tous les articles de type Place?

1
Chris

Cela dépend du plugin que vous utilisez pour générer vos champs personnalisés.

Par exemple, le plugin Champs personnalisés avancés a cette option intégrée - le type de champ est appelé " Objet de publication ".

Documentation:
ACF > Types de champs > Post Object

Capture d'écran:

ACF Post Object Options

1
Michal Mau

Comme le souligne Michal Mau, ACF est facile et efficace d’automatiser ce type de gestion Custom Field/Meta Box.

Le mode manuel utilise les crochets d'action add_meta_box et save_post. Dans cet exemple, vous devrez ajuster les tableaux indiqués pour simplement array( 'place' ). Vérifiez les commentaires pour plus de détails:

add_action( 'add_meta_boxes', 'add_custom_box_wpse_94701' );
add_action( 'save_post', 'save_postdata_wpse_94701', 10, 2 );

function add_custom_box_wpse_94701() 
{
    // Post types to insert the meta box. Adjust array <-------
    foreach( array( 'post', 'portfolio' ) as $pt )
        add_meta_box(
            'sectionid_wpse_94701',
            __( 'Custom parent' ), 
            'blogroll_box_wpse_94701',
            $pt,
            'side'
        );
}


function blogroll_box_wpse_94701() 
{
    global $post, $typenow;

    // Get all posts of a type, excluding the current post
    $args = array(
        'numberposts' => -1,
        'post_type'   => $typenow,
        'post_status' => 'publish,future',
        'exclude'     => $post->ID,
    );
    $get_posts = get_posts( $args );

    $saved = get_post_meta( $post->ID, 'custom_parent', true);

    // Security
    wp_nonce_field( plugin_basename( __FILE__ ), 'noncename_wpse_94701' );

    // Dropdown
    echo '<select name="custom_parent" id="custom_parent">
        <option value="">- Select -</option>';
    foreach ( $get_posts as $parent_post ) 
    {
        printf(
            '<option value="%d" %s> %s</option>',
            $parent_post->ID,
            selected( $saved, $parent_post->ID, false),
            $parent_post->post_title
        );
    }
    echo '</select>';
}


function save_postdata_wpse_94701( $post_id, $post_object ) 
{
    // Verify auto save 
    if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) 
        return;

    // Security
    if ( 
        !isset( $_POST['noncename_wpse_94701'] ) 
        || !wp_verify_nonce( $_POST['noncename_wpse_94701'], plugin_basename( __FILE__ ) ) 
        )
        return;

    // Allowed post types. Adjust array <-------
    $allowed_post_types = array( 'post', 'portfolio' );
    if ( !in_array( $post_object->post_type, $allowed_post_types ) )
        return;

    // Process post data
    if ( isset( $_POST['custom_parent'] )  )
        update_post_meta( $post_id, 'custom_parent', $_POST['custom_parent'] );
    else 
        delete_post_meta( $post_id, 'custom_parent' );
}

enter image description hereenter image description here

1
brasofilo