Wie kann ich ein benutzerdefiniertes Meta-Feld über dem Editor, aber unter dem Titelabschnitt auf der Seite zum Bearbeiten von Beiträgen platzieren?

30

Ich habe ein benutzerdefiniertes Meta-Feld für einen benutzerdefinierten Beitragstyp, den mein Kunde im Admin-Bereich zwischen dem Titel- / Permalink-Bereich und dem Beitragseditor platzieren möchte. Ist dies möglich und wenn ja, gibt es einen Haken / Filter / etc, den ich verwenden müsste?

cstrouse
quelle
Sehr ähnliche Frage hier: wordpress.stackexchange.com/questions/35416/…
Simon East

Antworten:

51
  • Fügen Sie einfach eine Meta-Box mit dem erweiterten Kontext und hoher Priorität hinzu
  • Rasten Sie dann am edit_form_after_titleHaken ein
  • Drucken Sie Ihre Meta-Boxen aus und entfernen Sie sie, damit sie nicht zweimal angezeigt werden.

    // Move all "advanced" metaboxes above the default editor
    add_action('edit_form_after_title', function() {
        global $post, $wp_meta_boxes;
        do_meta_boxes(get_current_screen(), 'advanced', $post);
        unset($wp_meta_boxes[get_post_type($post)]['advanced']);
    });
Andrew
quelle
Eine Site, an der ich arbeite, registriert einige Metaboxen mit dem register_meta_box_cbParameter der register_post_typeFunktion. Ich habe Ihren Code ausprobiert, aber die Metaboxen bewegen sich nicht über dem Editor. Kann dies in meinem Fall verwendet werden? Vielen Dank
Leemon
Ich würde empfehlen, eine benutzerdefinierte $contextanstelle einer advancedmy_before_editoradvanced
solchen zu
14

Hier ist, wie Sie bestimmte Meta-Boxen über den Editor verschieben können, aber bevor ich den Code poste, möchte ich mich bei Andrew und mhulse bedanken. Ihr rockt!

function foo_deck( $post_type ) {
    if ( in_array( $post_type, array( 'post', 'page' ) ) ) {
        add_meta_box(
            'contact_details_meta',
            'Contact Details',
            'contact_details_meta',
            $post_type,
            'test', // change to something other then normal, advanced or side
            'high'
        );
    }
}

add_action('add_meta_boxes', 'foo_deck');

function foo_move_deck() {
        # Get the globals:
        global $post, $wp_meta_boxes;

        # Output the "advanced" meta boxes:
        do_meta_boxes( get_current_screen(), 'test', $post );

        # Remove the initial "advanced" meta boxes:
        unset($wp_meta_boxes['post']['test']);
    }

add_action('edit_form_after_title', 'foo_move_deck');
Adamj
quelle
1
change to something other then normal, advanced or side-war der Schlüssel in meinem Fall. Danke für die Information.
Mayeenul Islam
Dies war die hilfreichste Antwort für mich. Vielen Dank!
Marvinpoo
12

Um ein vollständiges Codebeispiel basierend auf Andrews Antwort bereitzustellen ... Ich brauchte eine Möglichkeit, meinen Posts ein "Deck" (auch bekannt als Subhead) hinzuzufügen. Ich wollte, dass das Deck-Feld nach der Haupttitelleiste erscheint.

/**
 * Add a "deck" (aka subhead) meta box to post page(s) and position it
 * under the title.
 *
 * @todo Move to class.
 * @see http://codex.wordpress.org/Function_Reference/add_meta_box
 * @see http://wordpress.org/extend/ideas/topic/add-meta-box-to-multiple-post-types
 * @see https://github.com/Horttcore/WordPress-Subtitle
 * @see http://codex.wordpress.org/Function_Reference/wp_nonce_field
 */

# Adds a box to the main column on the Post and Page edit screens:
function foo_deck($post_type) {

    # Allowed post types to show meta box:
    $post_types = array('post', 'page');

    if (in_array($post_type, $post_types)) {

        # Add a meta box to the administrative interface:
        add_meta_box(
            'foo-deck-meta-box', // HTML 'id' attribute of the edit screen section.
            'Deck',              // Title of the edit screen section, visible to user.
            'foo_deck_meta_box', // Function that prints out the HTML for the edit screen section.
            $post_type,          // The type of Write screen on which to show the edit screen section.
            'advanced',          // The part of the page where the edit screen section should be shown.
            'high'               // The priority within the context where the boxes should show.
        );

    }

}

# Callback that prints the box content:
function foo_deck_meta_box($post) {

    # Use `get_post_meta()` to retrieve an existing value from the database and use the value for the form:
    $deck = get_post_meta($post->ID, '_deck', true);

    # Form field to display:
    ?>

        <label class="screen-reader-text" for="foo_deck">Deck</label>
        <input id="foo_deck" type="text" autocomplete="off" value="<?=esc_attr($deck)?>" name="foo_deck" placeholder="Deck">

    <?php

    # Display the nonce hidden form field:
    wp_nonce_field(
        plugin_basename(__FILE__), // Action name.
        'foo_deck_meta_box'        // Nonce name.
    );

}

/**
 * @see https://wordpress.stackexchange.com/a/16267/32387
 */

# Save our custom data when the post is saved:
function foo_deck_save_postdata($post_id) {

    # Is the current user is authorised to do this action?
    if ((($_POST['post_type'] === 'page') && current_user_can('edit_page', $post_id) || current_user_can('edit_post', $post_id))) { // If it's a page, OR, if it's a post, can the user edit it? 

        # Stop WP from clearing custom fields on autosave:
        if ((( ! defined('DOING_AUTOSAVE')) || ( ! DOING_AUTOSAVE)) && (( ! defined('DOING_AJAX')) || ( ! DOING_AJAX))) {

            # Nonce verification:
            if (wp_verify_nonce($_POST['foo_deck_meta_box'], plugin_basename(__FILE__))) {

                # Get the posted deck:
                $deck = sanitize_text_field($_POST['foo_deck']);

                # Add, update or delete?
                if ($deck !== '') {

                    # Deck exists, so add OR update it:
                    add_post_meta($post_id, '_deck', $deck, true) OR update_post_meta($post_id, '_deck', $deck);

                } else {

                    # Deck empty or removed:
                    delete_post_meta($post_id, '_deck');

                }

            }

        }

    }

}

# Get the deck:
function foo_get_deck($post_id = FALSE) {

    $post_id = ($post_id) ? $post_id : get_the_ID();

    return apply_filters('foo_the_deck', get_post_meta($post_id, '_deck', TRUE));

}

# Display deck (this will feel better when OOP):
function foo_the_deck() {

    echo foo_get_deck(get_the_ID());

}

# Conditional checker:
function foo_has_subtitle($post_id = FALSE) {

    if (foo_get_deck($post_id)) return TRUE;

}

# Define the custom box:
add_action('add_meta_boxes', 'foo_deck');
# Do something with the data entered:
add_action('save_post', 'foo_deck_save_postdata');

/**
 * @see https://wordpress.stackexchange.com/questions/36600
 * @see https://wordpress.stackexchange.com/questions/94530/
 */

# Now move advanced meta boxes after the title:
function foo_move_deck() {

    # Get the globals:
    global $post, $wp_meta_boxes;

    # Output the "advanced" meta boxes:
    do_meta_boxes(get_current_screen(), 'advanced', $post);

    # Remove the initial "advanced" meta boxes:
    unset($wp_meta_boxes['post']['advanced']);

}

add_action('edit_form_after_title', 'foo_move_deck');

Offensichtlich könnte der obige Code etwas mehr Arbeit gebrauchen, aber es sollte anderen helfen, die gleichen Dinge zu tun (Andrews Antwort schien hell, aber ich dachte, es könnte hilfreich sein, tatsächlich ein funktionierendes Beispiel zu liefern).

Diese Antwort hat auch geholfen .

Mögliche Verbesserungen:

  1. Machen Sie OOP / Klasse (n).
  2. Fügen Sie Stile / js hinzu, damit es wie das Titelfeld aussieht / sich anfühlt / verhält.

Ich plane, die obigen Verbesserungen zu einem späteren Zeitpunkt vorzunehmen, aber der obige Code sollte zumindest anderen helfen, dies herauszufinden.

Siehe Quelltext hier für mehr Inspiration (sie entschieden jQuery zu verwenden , um die „Untertitel“ zu bewegen).

mhulse
quelle
Für den Fall, dass es jemandem hilft, den gleichen Weg zu gehen: Ich habe hier eine Frage gestellt, die einen ähnlichen Code enthält (ich habe mich dafür entschieden, das Feld "title" zum Speichern und Filtern des Subheads zu verwenden).
mhulse
6

Anstatt alles im erweiterten Bereich nach oben zu verschieben, können Sie einen neuen Bereich erstellen und diesen nach oben verschieben:

// Create 'top' section and move that to the top
add_action('edit_form_after_title', function() {
  global $post, $wp_meta_boxes;
  do_meta_boxes(get_current_screen(), 'top', $post);
  unset($wp_meta_boxes[get_post_type($post)]['top']);
});

Jetzt müssen Sie nur noch die Meta-Box topfür den Abschnitt und highdie Priorität registrieren .

Es läuft auf WordPress 4.4.2 für mich. Ich habe dies nicht auf anderen WP-Versionen getestet.

titanic_fanatic
quelle
1

Es gibt noch eine andere Möglichkeit, den Editor an eine beliebige Position zu bringen:

  1. Entfernen Sie den Editor aus dem Support-Parameter, wenn Sie post_type registrieren

  2. füge eine gefälschte Metabox hinzu

    add_meta_box( 'does-not-matter', 
    __( 'Description'), 
    function($post){ 
      wp_editor($post->post_content,'post_content',array('name'=>'post_content'));
    },
    'post_type_type', 
    'advanced', 
    'high' );
Hix.botay
quelle
Zu Ihrer Information, das funktioniert immer noch, aber wenn Sie die Box bewegen, wird der Inhalt des Feldes merkwürdig verändert. Benutzer aufgepasst.
Eckstein