Jak mogę umieścić niestandardowe pole meta nad edytorem, ale poniżej sekcji tytułowej na stronie edycji posta?


Odpowiedzi:


51
  • Wystarczy dodać meta-box, używając zaawansowanego kontekstu i wysokiego priorytetu
  • Następnie zaczep na edit_form_after_titlehaku
  • Wydrukuj tam swoje skrzynki meta, a następnie usuń je, aby nie pojawiły się dwa razy.

    // 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']);
    });

Witryna, nad którą pracuję, rejestruje niektóre metaboksy za pomocą register_meta_box_cbparametru register_post_typefunkcji. Próbowałem twojego kodu, ale metaboksy nie poruszają się ponad edytorem. Czy można to wykorzystać w moim przypadku? Dzięki
leemon

Polecam użycie niestandardowego $contextzamiast advancedużycia czegoś podobnego my_before_editor, aby nie przenosić wszystkich metaboksów w advancedkontekście, a konkretnie celować w określone
metaboksy

14

Oto jak możesz przenieść określone pola meta nad edytorem, ale zanim opublikuję kod, chciałbym tylko podziękować Andrew i mhulse. Rocky!

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');

1
change to something other then normal, advanced or side-jest kluczem w moim przypadku. Dzięki za informację.
Mayeenul Islam,

To była dla mnie najbardziej pomocna odpowiedź. Dziękuję Ci!
marvinpoo,

12

Aby podać pełny przykład kodu oparty na odpowiedzi Andrzeja ... Potrzebowałem sposobu, aby dołączyć „Post” (aka podtytuł) do moich postów; Chciałem, aby pole talii pojawiło się po głównym pasku tytułu.

/**
 * 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');

Oczywiście powyższy kod może zużyć trochę więcej pracy, ale powinien pomóc innym próbować zrobić to samo (odpowiedź Andrew świeciła jasno, ale pomyślałem, że może być przydatne podanie rzeczywistego przykładu).

Ta odpowiedź również pomogła .

Ulepszenia, które można wprowadzić:

  1. Dokonaj OOP / klas (y).
  2. Dodaj style / js, aby wyglądało / działało / zachowywało się jak pole tytułu.

Planuję wprowadzić powyższe ulepszenia w pewnym momencie w przyszłości, ale przynajmniej powyższy kod powinien pomóc innym próbującym to zrozumieć.

Zobacz kod źródłowy tutaj, aby uzyskać więcej inspiracji (zdecydowali się użyć jQuery do przeniesienia „podtytułu”).


W przypadku, gdy pomaga to każdemu idąc tą samą ścieżką: zadałem tutaj pytanie, które ma jakiś pokrewny / podobny kod (zdecydowałem się użyć pola „tytuł” ​​do przechowywania i filtrowania podtytułu).
mhulse

6

Zamiast przesuwać wszystko w sekcji zaawansowanej na górę, dlaczego nie utworzyć nowej sekcji i przenieść ją na górę:

// 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']);
});

Teraz wystarczy zarejestrować pole meta topdla sekcji i highdla priorytetu.

Działa dla mnie WordPress 4.4.2. Nie testowałem tego na innych wersjach WP.


1

Istnieje inny sposób, w jaki sposób możemy ustawić edytor w dowolnej pozycji:

  1. Usuń edytor z parametru wsparcia podczas rejestracji typu post_typ

  2. dodaj fałszywy metaboks

    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' );

Do Twojej wiadomości, to nadal działa, ale kiedy przesuwasz pole, powoduje to dziwne zachowanie z zawartością pola. Użytkownicy strzeżcie się.
Eckstein,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.