it-swarm.com.de

Block mit mehreren Inhalten

Ich versuche, einen benutzerdefinierten Beitragstyp zu erstellen, und möchte, dass dieser Beitragstyp zwei Inhaltsblöcke enthält. Damit ich in der Schleife nach Inhalt-1 und Inhalt-2 getrennt fragen kann.

Ich kann den Code schreiben, nur weil es mir schwer fällt, herauszufinden, wie ich anfangen soll, d. H. Gibt es eine Möglichkeit, auf einfache Weise einen weiteren "Post-Content" -Block hinzuzufügen. Sollte ich den vorhandenen Inhaltsblock entfernen und zwei benutzerdefinierte Felder verwenden (können benutzerdefinierte Felder das Spülbecken haben?)?

Vielen Dank!

2
Omar Mir

Ich würde das primäre Inhaltsfeld behalten und eine Metabox + eine sekundäre Instanz des WP-Editors hinzufügen (unter Verwendung der praktischen wp_editor Funktion).

Benutzerdefinierte Feldwerte werden in der Datenbank als LONGTEXT gespeichert, sodass sie fast alles verarbeiten können, was Sie auf sie werfen möchten.

Eine Klasse, die alles einpackt. Es gibt hier ein paar Konstanten, die wir später verwenden werden.

<?php
class Secondary_Content
{
    // meta key we'll use to save things.
    const META = '_secondary_content';

    // nonce name to check
    const NONCE = '_s_content_nonce';

    // post type to which we'll add the box
    const TYPE = 'page';

    private static $ins = null;

    public static function init()
    {
        add_action('plugins_loaded', array(self::instance(), '_setup'));
    }

    public static function instance()
    {
        is_null(self::$ins) && self::$ins = new self;
        return self::$ins;
    }

    public function _setup()
    {
        // we'll add actions here later.
    }
}

Um die Meta-Box hinzuzufügen, schließen Sie sich an add_meta_boxes_{{YOUR_POST_TYPE}} an. Ich werde nur Seiten für dieses Beispiel verwenden. Ändern Sie den Wert der Konstanten TYPE in der Klasse, damit er für einen benutzerdefinierten Beitragstyp funktioniert.

<?php
class Secondary_Content
{
    // snip snip

    public function _setup()
    {
        add_action('add_meta_boxes_' . self::TYPE, array($this, 'add_box'));
    }

    /**
     * Adds a meta box to the `page` post type.
     *
     * @uses    add_meta_box
     * @return  void
     */
    public function add_box()
    {
        add_meta_box(
            'secondary-content',
            __('Secondary Content', 'wspe'),
            array($this, 'box_cb'),
            self::TYPE,
            'normal',
            'high'
        );
    }

    /**
     * Metabox callback function.
     *
     * @access  public
     * @param   object $post The current $post
     * @uses    get_post_meta
     * @uses    wp_editor
     * @return  void
     */
    public function box_cb($post)
    {
        wp_nonce_field(self::NONCE . $post->ID, self::NONCE, false);

        wp_editor(
            get_post_meta($post->ID, self::META, true),
            self::META
        );
    }
}

Der Meta-Box-Rückruf ist ebenfalls oben enthalten. Es spuckt nur eine Nonce aus, die wir ebenso wie das Editorfeld mit wp_editor validieren müssen.

Jetzt müssen wir uns nur noch in save_post einhängen und die Dinge speichern. Wir werden überprüfen, ob wir den richtigen Beitragstyp haben. Bestätigen Sie dann die Nonce und prüfen Sie, ob der aktuelle Benutzer berechtigt ist, den Beitrag zu bearbeiten. Dann müssen Sie nur noch update_post_meta oder delete_post_meta aufrufen. Die einzige andere Bemerkung ist, dass ich überprüfe, ob der aktuelle Benutzer ungefiltertes HTML posten kann. Wenn sie können, lasse ich einfach alles in der Meta-Box durch. Wenn nicht, führen Sie es besser durch wp_filter_post_kses .

<?php
class Secondary_Content
{
    // snip snip

    public function _setup()
    {
        add_action('add_meta_boxes_' . self::TYPE, array($this, 'add_box'));
        add_action('save_post', array($this, 'save'), 10, 2);
    }

    // snip snip

    /**
     * Hooked into `save_post`.  Makes sure this is the request we want and the
     * user has permission, then saves the custom field.
     *
     * @access  public
     * @param   int $post_id
     * @param   object $post
     * @uses    wp_verify_nonce
     * @uses    current_user_can
     * @uses    update_post_meta
     * @uses    delete_post_meta
     * @return  void
     */
    public function save($post_id, $post)
    {
        if(
            self::TYPE != $post->post_type ||
            (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE)
        ) return;

        if(
            !isset($_POST[self::NONCE]) ||
            !wp_verify_nonce($_POST[self::NONCE], self::NONCE . $post_id)
        ) return;

        if(!current_user_can('edit_post', $post_id))
            return;

        if(!empty($_POST[self::META]))
        {
            update_post_meta(
                $post_id,
                self::META,
                current_user_can('unfiltered_html') ?
                    $_POST[self::META] : wp_filter_post_kses($_POST[self::META])
            );
        }
        else
        {
            delete_post_meta($post_id, self::META);
        }
    }
}

Um dies auf dem Frontend abzurufen, müssen Sie nur echo get_post_meta($post->ID, '_secondary_content', true); irgendwo in der Schleife ausführen. Aber es könnte schöner sein, eine Wrapper-Funktion in unsere Klasse aufzunehmen.

<?php
class Secondary_Content
{
    // snip snip

    /**
     * Meant to be used as a template tag. A simple helper to spit out our
     * secondary content.
     *
     * @access  public
     * @param   object $post
     * @param   bool $echo (optional) defaults to true.
     * @uses    get_post_meta
     * @return  string
     */
    public static function content($post, $echo=true)
    {
        $res = apply_filters('secondary_content',
            get_post_meta($post->ID, self::META, true));

        if($echo)
            echo $res;

        return $res;
    }
}

Jetzt können Sie einfach Secondary_Content::content($post); ausführen, um Dinge abzurufen.

Ein letzter Hinweis: Dieser Inhalt wird nichts Nettes wie wpautop oder ähnliches bekommen. Wenn Sie dies tun möchten, müssen Sie dies als Filter zur endgültigen Ausgabe hinzufügen.

<?php
add_filter('secondary_content', 'wpautop');

Das Endergebnis:

Secondary Content

Alle oben genannten als Plugin .

6
chrisguitarguy