Come aggiungere la categoria a: 'wp-admin / post-new.php'?


9

Voglio avere un link per creare un nuovo post che imposta anche la categoria.

Ho provato wp-admin/post-new.php?post_category=12e wp-admin/post-new.php?cat=12, ma nessuno dei due ha funzionato. Ho anche provato a usare il nome piuttosto che l'id della categoria; che non ha avuto alcun effetto.

Come faccio a creare un collegamento a un nuovo post con una categoria predefinita?

Risposte:


4

Dave James Miller al GitHub ha inchiodato questo per me. Nessuno dei lavori viene da me, sto solo pubblicando il suo codice racchiuso in un plguin poiché funziona perfettamente come pubblicizzato:

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

L'uso del metodo sopra funziona alla grande, tuttavia sembrerebbe che le regole avanzate dei campi personalizzati (un altro popolare plug-in) che si basano sulla categoria post, non vengano caricate correttamente (ovvero i campi personalizzati per quella categoria non vengono caricati). Qualcuno ha immaginato una soluzione per questo?
Aphire il

9

Aggancia wp_insert_post, verifica lo stato del post auto-drafte l'URL per un GETparametro.

Ma prima abbiamo bisogno di una funzione di supporto per ottenere e disinfettare il GETparametro:

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

Ora il gestore di bozze automatiche:

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

Funziona solo se è get_default_post_to_edit()stato chiamato con il secondo parametro $create_in_dbimpostato su TRUE. Per catturare l'altro caso devi filtrare l'opzione default_category:

add_filter( 'pre_option_default_category', 't5_get_default_cat_by_url' );

Ora puoi usare il parametro post_catper passare un elenco separato da virgole di lumache di categoria:

inserisci qui la descrizione dell'immagine

Guarda anche:


Ho provato questa soluzione incollando il codice nel mio file Functions.php e non ha funzionato. Mi sto perdendo qualcosa? Devo fare di più come chiamare la funzione per farlo fare il lavoro?
Jamie,

@Jamie Non ha funzionato è troppo vago. :)
fuxia

Ho pensato aggiungendo il codice in Functions.php che quando seleziono una categoria, aggiungerebbe quel parametro alla fine della stringa come nella foto sopra. Sto cercando di aggiungere un metabox solo a una categoria specifica. Quindi userò $ _GET per verificare se sono nella categoria corretta per caricare il metabox. Quando ho provato il codice e ho cercato di replicare ciò che è nella tua foto sopra, non è successo niente. Tutto quello che ho ottenuto è stato wp-admin / post-new.php. Sto cercando di ottenere wp-admin / post-new.php? Post_cat = audio
Jamie

@Jamie Questo codice funziona al contrario: costruisci il link manualmente (ad esempio per inviarlo a qualcuno tramite e-mail) e il codice imposterà la categoria corretta. Non crea alcun collegamento.
fuxia

1

Penso che puoi andare sull'opzione predefinita default_categorye filtrare option_default_categoryquesto, se l'URL ha un parametro per la categoria, come questa fonte di esempio. Usalo come plugin, testalo. È stato scritto da zero e non testato.

Il parametro url è post_cate puoi impostare la categoria, come questo url: /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' ) );

0

Mi rendo conto che è già stata data una risposta, ma volevo aggiungere la mia opinione. L'ho aggiunto a una sintesi qui https://gist.github.com/malcalevak/ba05b4fbed0c6e33ac8c18c1451bd857

Per salvarti la seccatura, però, ecco il codice:

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

Simile a tutti gli altri, lo avresti attivato tramite /wp-admin/post-new.php?category=categoryname

Cordiali saluti, se stai utilizzando i campi personalizzati avanzati, come @Aphire, funzionerà.


funziona se è un post semplice. Se esiste un parametro post_type, non funziona. Come posso risolvere questo problema per riconoscere wp-admin / post-new.php? Post_type = wpdmpro? Categoria = mycategory
yurividal

@yurividal sfortunatamente, al momento non ho un ambiente impostato, la mia memoria è confusa, ma una rapida occhiata al codice di WordPress Download Manager sembra che il problema potrebbe essere che sta usando una tassonomia personalizzata che "sembra" come la tassonomia di categoria integrata, ma non lo è.
Malcalevak,

@yurividal non intendeva porre fine al commento. Probabilmente dovrai regolare la funzione get_category_by_slug con una su get_term_by e quindi regolare wp_set_post_terms per impostare la tassonomia personalizzata di wpdmcategory.
Malcalevak,

Wow, sembra un po 'complicato e non credo di avere abbastanza abilità php per quello. Comunque, grazie per il tuo aiuto, proverò a scavare più a fondo in questo.
yurividal

@yurividal Non credo che sarebbe che complicato, ma ho potuto sicuramente vedere come scoraggiante per il meno bene avviata con PHP e / o WordPress. Se riesco a trovare del tempo libero, proverò a mettere insieme qualcosa, la mia unica preoccupazione è che al momento non riesco a provarlo, il che renderebbe la diagnosi dei problemi un po '... complicata.
Malcalevak,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.