Comment ajouter une catégorie à: 'wp-admin / post-new.php'?


9

Je veux avoir un lien pour créer un nouveau message qui définit également la catégorie.

J'ai essayé wp-admin/post-new.php?post_category=12et wp-admin/post-new.php?cat=12, mais aucun n'a fonctionné. J'ai également essayé d'utiliser le nom plutôt que l'ID de la catégorie; qui n'a également eu aucun effet.

Comment créer un lien vers une nouvelle publication avec une catégorie par défaut?

Réponses:


4

Dave James Miller chez GitHub a cloué celui-ci pour moi. Aucun travail n'est de moi, je poste juste son code enveloppé dans un plguin car il fonctionne parfaitement comme annoncé:

<?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'utilisation de la méthode ci-dessus fonctionne très bien, mais il semblerait que les règles de champs personnalisés avancés (un autre plug-in populaire) qui dépendent de la catégorie de publication ne se chargent pas correctement (c'est-à-dire que les champs personnalisés de cette catégorie ne se chargent pas). Quelqu'un a-t-il trouvé une solution pour cela?
Aphire

9

Accrochez-vous wp_insert_post, testez l'état de la publication auto-draftet l'URL d'un GETparamètre.

Mais nous avons d'abord besoin d'une fonction d'aide pour obtenir et assainir le GETparamètre:

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

Maintenant, le gestionnaire de rédaction automatique:

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

Cela ne fonctionne que si a get_default_post_to_edit()été appelé avec le deuxième paramètre $create_in_dbdéfini sur TRUE. Pour attraper l'autre cas, vous devez filtrer l'option default_category:

add_filter( 'pre_option_default_category', 't5_get_default_cat_by_url' );

Vous pouvez maintenant utiliser le paramètre post_catpour passer une liste de slugs de catégorie séparés par des virgules:

entrez la description de l'image ici

Voir également:


J'ai essayé cette solution en collant le code dans mon fichier functions.php et cela n'a pas fonctionné. Suis-je en train de manquer quelque chose? Dois-je faire plus comme appeler la fonction pour qu'elle fasse le travail?
Jamie

@Jamie N'a pas fonctionné est trop vague. :)
fuxia

J'ai pensé en ajoutant le code dans functions.php que lorsque je cocherais une catégorie, cela ajouterait ce paramètre à la fin de la chaîne comme sur la photo ci-dessus. J'essaie d'ajouter une métabox à une catégorie spécifique uniquement. Ensuite, j'utiliserai $ _GET pour tester si je suis dans la bonne catégorie pour charger la métabox. Lorsque j'ai essayé le code et essayé de reproduire ce qui se trouve sur votre photo ci-dessus, rien ne s'est produit. Tout ce que j'ai obtenu était wp-admin / post-new.php. J'essaye d'obtenir wp-admin / post-new.php? Post_cat = audio
Jamie

@Jamie Ce code fonctionne dans l'autre sens: vous créez le lien manuellement (par exemple pour l'envoyer à quelqu'un par e-mail) et le code définira la catégorie appropriée. Il ne crée aucun lien.
fuxia

1

Je pense que vous pouvez aller sur l'option par défaut default_categoryet filtrer option_default_categorycela, si l'url a un paramètre pour la catégorie, comme cet exemple de source. Utilisez-le comme plugin, testez-le. A été écrit à partir de zéro et non testé.

Le paramètre d'URL est post_catet vous pouvez définir la catégorie, comme cette 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

Je me rends compte que cela a déjà été répondu, mais je voulais ajouter ma propre opinion. Je l'ai ajouté à un résumé ici https://gist.github.com/malcalevak/ba05b4fbed0c6e33ac8c18c1451bd857

Pour vous éviter les tracas, cependant, voici le 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 );

Comme tous les autres, vous le déclencheriez via /wp-admin/post-new.php?category=categoryname

Pour info, si vous utilisez des champs personnalisés avancés, comme @Aphire, cela fonctionnera.


cela fonctionne s'il s'agit d'un simple message. S'il existe un paramètre post_type, il ne fonctionne pas. Comment puis-je résoudre ce problème pour reconnaître wp-admin / post-new.php? Post_type = wpdmpro? Category = mycategory
yurividal

@yurividal malheureusement, je n'ai pas d'environnement configuré pour le moment, ma mémoire est floue, mais un rapide coup d'œil au code du gestionnaire de téléchargement WordPress semble que le problème pourrait être qu'il utilise une taxonomie personnalisée qui "ressemble" à la taxonomie de catégorie intégrée, mais ne l'est pas.
Malcalevak

@yurividal ne voulait pas mettre fin au commentaire. Vous devrez probablement ajuster la fonction get_category_by_slug avec une pour get_term_by , puis ajuster wp_set_post_terms pour définir la taxonomie wpdmcategory personnalisée.
Malcalevak

Wow, cela semble un peu compliqué et je ne pense pas avoir suffisamment de compétences php pour cela. Quoi qu'il en soit, merci de votre aide, je vais essayer d'approfondir cela.
yurividal

@yurividal Je ne pense pas que ce serait si compliqué, mais je pourrais certainement le voir comme intimidant pour les moins bien initiés avec PHP et / ou WordPress. Si je peux trouver du temps à perdre, je vais essayer de mettre quelque chose ensemble, ma seule préoccupation est que je ne peux pas le tester actuellement, ce qui rendrait le diagnostic des problèmes un peu ... compliqué.
Malcalevak
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.