Wie füge ich eine Kategorie hinzu zu: 'wp-admin / post-new.php'?

9

Ich möchte einen Link haben, um einen neuen Beitrag zu erstellen, der auch die Kategorie festlegt.

Ich habe es versucht wp-admin/post-new.php?post_category=12und wp-admin/post-new.php?cat=12, aber keiner hat funktioniert. Ich habe auch versucht, den Namen anstelle der ID der Kategorie zu verwenden. das hatte auch keinen Einfluss.

Wie erstelle ich einen Link zu einem neuen Beitrag mit einer Standardkategorie?

BEIM
quelle

Antworten:

4

Dave James Miller von GitHub hat diesen für mich festgenagelt. Keine der Arbeiten stammt von mir, ich poste nur seinen Code, der in einen Plguin eingewickelt ist, da er wie angekündigt perfekt funktioniert:

<?php
/**
 * Plugin Name: Set default category from url parameter
 * Plugin URI:  https://gist.github.com/davejamesmiller/1966543
 * Description: enables you to setup new post links with the post_title, category and tags in the url: <code><a href="<?= esc_attr(admin_url('post-new.php?post_title=Default+title&category=category1&tags=tag1,tag2')) ?>">New post</a></code>
 * Version:     0.0.1
 * Author:      davejamesmiller
 * Author URI:  https://gist.github.com/davejamesmiller
 */

// I used this code to automatically set the default post title, category and
// tags for a new WordPress post based on which link was clicked. It could also
// be tweaked to hard-code the values instead of using request parameters.


add_filter('wp_get_object_terms', function($terms, $object_ids, $taxonomies, $args)
{
    if (!$terms && basename($_SERVER['PHP_SELF']) == 'post-new.php') {

        // Category - note: only 1 category is supported currently
        if ($taxonomies == "'category'" && isset($_REQUEST['category'])) {
            $id = get_cat_id($_REQUEST['category']);
            if ($id) {
                return array($id);
            }
        }

        // Tags
        if ($taxonomies == "'post_tag'" && isset($_REQUEST['tags'])) {
            $tags = $_REQUEST['tags'];
            $tags = is_array($tags) ? $tags : explode( ',', trim($tags, " \n\t\r\0\x0B,") );
            $term_ids = array();
            foreach ($tags as $term) {
                if ( !$term_info = term_exists($term, 'post_tag') ) {
                    // Skip if a non-existent term ID is passed.
                    if ( is_int($term) )
                        continue;
                    $term_info = wp_insert_term($term, 'post_tag');
                }
                $term_ids[] = $term_info['term_id'];
            }
            return $term_ids;
        }
    }
    return $terms;
}, 10, 4);
user67014
quelle
Die Verwendung der oben genannten Methode funktioniert hervorragend. Es scheint jedoch, dass erweiterte Regeln für benutzerdefinierte Felder (ein weiteres beliebtes Plug-In), die auf der Post-Kategorie basieren, nicht korrekt geladen werden (dh die benutzerdefinierten Felder für diese Kategorie werden nicht geladen). Hat jemand eine Problemumgehung dafür gefunden?
Aphire
9

Haken Sie ein wp_insert_post, testen Sie den Post-Status für auto-draftund die URL für einen GETParameter.

Aber zuerst benötigen wir eine Hilfsfunktion, um den GETParameter abzurufen und zu bereinigen :

/**
 * Set default category.
 *
 * @wp-hook pre_option_default_category
 * @return  string Category slug
 */
function t5_get_default_cat_by_url()
{
    if ( ! isset( $_GET['post_cat'] ) )
        return FALSE;

    return array_map( 'sanitize_title', explode( ',', $_GET['post_cat'] ) );
}

Jetzt der Auto-Draft-Handler:

add_action( 'wp_insert_post', 't5_draft_category', 10, 2 );

/**
 * Add category by URL parameter to auto-drafts.
 *
 * @wp-hook wp_insert_post
 * @param   int $post_ID
 * @param   object $post
 * @return  WP_Error|array An error object or term ID array.
 */
function t5_draft_category( $post_ID, $post )
{
    if ( ! $cat = t5_get_default_cat_by_url()
        or 'auto-draft' !== $post->post_status )
        return;

    // return value will be used in unit tests only.
    return wp_set_object_terms( $post_ID, $cat, 'category' );
}

Dies funktioniert nur, wenn get_default_post_to_edit()der zweite Parameter $create_in_dbauf aufgerufen wurde TRUE. Um den anderen Fall zu erfassen, müssen Sie die Option filtern default_category:

add_filter( 'pre_option_default_category', 't5_get_default_cat_by_url' );

Jetzt können Sie den Parameter verwenden post_cat, um eine durch Kommas getrennte Liste von Kategorie-Slugs zu übergeben:

Geben Sie hier die Bildbeschreibung ein

Siehe auch:

Fuxia
quelle
Ich habe diese Lösung ausprobiert, indem ich den Code in meine Datei functions.php eingefügt habe, aber es hat nicht funktioniert. Vermisse ich etwas Muss ich mehr tun, als die Funktion aufzurufen, damit sie die Arbeit erledigt?
Jamie
@ Jamie Hat nicht funktioniert ist zu vage. :)
Fuxia
Ich dachte, indem ich den Code in functions.php hinzufüge, dass wenn ich eine Kategorie ankreuze, dieser Parameter am Ende der Zeichenfolge hinzugefügt wird, wie auf dem Foto oben. Ich versuche, eine Metabox nur einer bestimmten Kategorie hinzuzufügen. Dann werde ich $ _GET verwenden, um zu testen, ob ich in der richtigen Kategorie bin, um die Metabox zu laden. Als ich den Code ausprobiert und versucht habe, das zu replizieren, was auf Ihrem Foto oben steht, ist nichts passiert. Alles was ich bekam war wp-admin / post-new.php. Ich versuche wp-admin / post-new.php zu bekommen? Post_cat = audio
Jamie
@Jamie Dieser Code funktioniert umgekehrt: Sie erstellen den Link manuell (z. B. um ihn per E-Mail an jemanden zu senden), und der Code legt die richtige Kategorie fest. Dabei spielt es keine erstellen einen Link.
Fuxia
1

Ich denke, Sie können die Standardoption verwenden default_categoryund option_default_categorydiese filtern , wenn die URL einen Parameter für die Kategorie hat, wie in dieser Beispielquelle. Verwenden Sie es als Plugin, testen Sie es. Wurde von Grund auf neu geschrieben und nicht getestet.

Der URL-Parameter lautet post_catund Sie können die Kategorie wie folgt festlegen: /wp-admin/post-new.php?post_cat=categoryname

<?php
/**
 * Plugin Name: .my Test
 * Plugin URI:  http://bueltge.de/
 * Description: 
 * Version:     0.0.1
 * Author:      Frank B&uuml;ltge
 * Author URI:  http://bueltge.de/
 */
class Set_Default_Cat_From_Url_Param {

    protected static $classobj = NULL;

    public static function init() {

        NULL === self::$classobj and self::$classobj = new self();

        return self::$classobj;
    }

    function __construct() {

        if ( isset( $_GET['post_cat'] ) )
            add_filter( 'option_default_category', array( $this, 'get_category' ) );
    }

    function get_category( $category ) {

        if ( isset( $_GET['post_cat'] ) )
            $category = get_cat_ID( esc_attr( $_GET['post_cat'] ) );

        return $category;
    }

}
add_action( 'load-post-new.php', array( 'Set_Default_Cat_From_Url_Param', 'init' ) );
bueltge
quelle
0

Mir ist klar, dass dies bereits beantwortet wurde, aber ich wollte meine eigene Einstellung hinzufügen. Ich habe es hier https://gist.github.com/malcalevak/ba05b4fbed0c6e33ac8c18c1451bd857 hinzugefügt

Um Ihnen den Ärger zu ersparen, ist hier der Code:

function set_category () {

    global $post;
  //Check for a category parameter in our URL, and sanitize it as a string
    $category_slug = filter_input(INPUT_GET, 'category', FILTER_SANITIZE_STRING, array("options" => array("default" => 0)));

  //If we've got a category by that name, set the post terms for it
    if ( $category = get_category_by_slug($category_slug) ) {
        wp_set_post_terms( $post->ID, array($category->term_id), 'category' );
    }

}

//hook it into our post-new.php specific action hook
add_action( 'admin_head-post-new.php', 'set_category', 10, 1 );

Ähnlich wie bei allen anderen würden Sie es über /wp-admin/post-new.php?category=categoryname auslösen

Zu Ihrer Information, wenn Sie erweiterte benutzerdefinierte Felder wie @Aphire verwenden, wird dies funktionieren.

Malcalevak
quelle
Dies funktioniert, wenn es sich um einen einfachen Beitrag handelt. Wenn es einen Parameter post_type gibt, funktioniert er nicht. Wie kann ich das beheben, um wp-admin / post-new.php zu erkennen? Post_type = wpdmpro? Category = mycategory
yurividal
@yurividal Leider habe ich momentan keine Umgebung eingerichtet. Mein Gedächtnis ist verschwommen, aber ein kurzer Blick auf den WordPress Download Manager-Code scheint das Problem zu sein, dass eine benutzerdefinierte Taxonomie verwendet wird, die "aussieht" die eingebaute Kategorie Taxonomie, ist es aber nicht.
Malcalevak
@yurividal wollte den Kommentar nicht beenden. Sie müssen wahrscheinlich die Funktion get_category_by_slug mit einer auf get_term_by anpassen und dann wp_set_post_terms anpassen , um die benutzerdefinierte Taxonomie für wpdmcategory festzulegen.
Malcalevak
Wow, das klingt etwas kompliziert und ich glaube nicht, dass ich genug PHP-Fähigkeiten dafür habe. Wie auch immer, danke für Ihre Hilfe, ich werde versuchen, mich eingehender damit zu befassen.
yurividal
@yurividal Ich glaube nicht , dass es sein , dass kompliziert, aber ich konnte es auf jeden Fall als abschreckend auf den weniger gut begonnen mit PHP und / oder Wordpress sehen. Wenn ich Zeit finde, werde ich versuchen, etwas zusammen zu werfen. Meine einzige Sorge ist, dass ich es derzeit nicht testen kann, was die Diagnose von Problemen etwas ... kompliziert machen würde.
Malcalevak