Kategorieauswahl erzwingen, bevor neuer Beitrag erstellt wird?

11

Wie kann ich den Benutzer zwingen, zuerst eine Kategorie auszuwählen, bevor er beim Erstellen eines neuen Beitrags mit dem Editor fortfährt? Ich möchte einige Standardinhalte festlegen , diese basieren jedoch auf der Kategorie. Daher muss ich dies wissen, bevor ich den Editor zeige (es sei denn, ich mache ausgefallene Ajax-Inhalte, aber in diesem Fall möchte ich das nicht tun).

Jan Fabry
quelle

Antworten:

11

Ich habe dieses Problem gelöst, indem ich mich eingehakt post-new.phpund nach einem category_idAnforderungsparameter gesucht habe. Wenn es nicht vorhanden ist, zeige ich ein Formular mit einer Kategorie-Dropdown-Liste an, die an diese Seite zurückgesendet wird, und rufe dann auf, exit()damit das reguläre Post-Formular nicht angezeigt wird. Wenn es existiert, habe ich einen Hook eingerichtet wp_insert_post, der die Kategorie hinzufügt. Dies funktioniert, weil über die get_default_post_to_edit()Funktion bereits ein neuer Beitrag in der Datenbank erstellt wurde und wir Kategorien, Tags oder andere (Meta-) Inhalte hinzufügen können. Das Formular wird danach mit dem "frischen" neuen Inhalt gerendert.

add_filter( 'load-post-new.php', 'wpse14403_load_post_new' );
function wpse14403_load_post_new()
{
    $post_type = 'post';
    if ( isset( $_REQUEST['post_type'] ) ) {
        $post_type = $_REQUEST['post_type'];
    }

    // Only do this for posts
    if ( 'post' != $post_type ) {
        return;
    }

    if ( array_key_exists( 'category_id', $_REQUEST ) ) {
        add_action( 'wp_insert_post', 'wpse14403_wp_insert_post' );
        return;
    }

    // Show intermediate screen
    extract( $GLOBALS );
    $post_type_object = get_post_type_object( $post_type );
    $title = $post_type_object->labels->add_new_item;

    include( ABSPATH . 'wp-admin/admin-header.php' );

    $dropdown = wp_dropdown_categories( array(
        'name' => 'category_id[]',
        'hide_empty' => false,
        'echo' => false,
    ) );

    $category_label = __( 'Category:' );
    $continue_label = __( 'Continue' );
    echo <<<HTML
<div class="wrap">
    <h2>{$title}</h2>

    <form method="get">
        <table class="form-table">
            <tbody>
                <tr valign="top">
                    <th scope="row">{$category_label}</th>
                    <td>{$dropdown}</td>
                </tr>
                <tr>
                    <td></td>
                    <th><input name="continue" type="submit" class="button-primary" value="{$continue_label}" /></th>
            </tbody>
        </table>
        <input type="hidden" name="post_type" value="{$post_type}" />
    </form>
</div>
HTML;
    include( ABSPATH . 'wp-admin/admin-footer.php' );
    exit();
}

// This function will only be called when creating an empty post,
// via `get_default_post_to_edit()`, called in post-new.php
function wpse14403_wp_insert_post( $post_id )
{
    wp_set_post_categories( $post_id, $_REQUEST['category_id'] );
}
Jan Fabry
quelle
Nett. Ich werde bald etwas Ähnliches tun müssen und habe mich gefragt, wie ich es tun würde!
MikeSchinkel
Entschuldigung, aber es funktioniert nicht - Ich habe den Text in post-new.php hinzugefügt, aber es passiert nichts. Irgendwelche Ideen ? Danke
1
@kiro: Sie sollten diesen Code nicht in post-new.php, sondern in Ihrem Thema functions.phpoder in einer Plugin-Datei hinzufügen .
Jan Fabry
@ JanFabry Tolle Lösung. Genau das, wonach ich suche. Vielen Dank!
Rofflox
Tolles Stück Code Ich habe es in meiner Multisite verwendet, um einigen Post-Kategorien ein Standard-Styling hinzuzufügen. Bei der Verwendung auf Websites mit dem erstaunlichen Plugin "adminimize" ist jedoch ein kleines Problem aufgetreten, das einen Fehler "ungültiger Beitragstyp" verursachte. Der Plugin-Autor schlug vor, das "// extract ($ GLOBALS);" line & das hat das Problem behoben.
Speedypancake