web-dev-qa-db-de.com

Liste der Beiträge in einem benutzerdefinierten Feld

Ich habe eine Frage. Ich habe einen benutzerdefinierten Beitragstyp namens "Ort". Ich habe eine Situation, in der Platz vorhanden sein kann. Ich möchte ein benutzerdefiniertes Feld parent_place haben, in dem ich einen übergeordneten Ort auswählen kann.
Der Ort kann keinen oder einen Elternteil haben.

Gibt es eine Möglichkeit, alle Beiträge (type = place) in einem benutzerdefinierten Feld aufzulisten und einen davon auszuwählen? In Plugins für benutzerdefinierte Felder kann ich Dropbox, Radio usw. auswählen, aber ich muss Werte eingeben. Wie kann ich automatisch eine Liste aller Posts ausfüllen, deren Typ "Ort" ist?

1
Chris

Dies hängt davon ab, welches Plugin Sie zum Generieren Ihrer benutzerdefinierten Felder verwenden.

Zum Beispiel hat das Plugin Erweiterte benutzerdefinierte Felder diese Option eingebaut - der Feldtyp heißt " Post Object ".

Dokumentation:
ACF > Feldtypen > Objekt posten

Screenshot:

ACF Post Object Options

1
Michal Mau

Wie Michal Mau betont, ist es mit ACF einfach und effektiv, diese Art der Verwaltung von benutzerdefinierten Feldern/Meta-Boxen zu automatisieren.

Der manuelle Modus verwendet die Aktions-Hooks add_meta_box und save_post. In diesem Beispiel müssten Sie die angegebenen Arrays einfach auf array( 'place' ) einstellen. Überprüfen Sie die Kommentare auf Details:

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