Como adicionar uma categoria a: 'wp-admin / post-new.php'?


9

Quero ter um link para criar uma nova postagem que defina a categoria também.

Eu tentei wp-admin/post-new.php?post_category=12e wp-admin/post-new.php?cat=12, mas nem funcionou. Eu também tentei usar o nome e não o id da categoria; que também não teve efeito.

Como crio um link para uma nova postagem com uma categoria padrão?

Respostas:


4

Dave James Miller, no GitHub, pregou esse aqui para mim. Nenhum trabalho é meu, estou apenas postando o código dele em um pinguim, pois funciona perfeitamente como anunciado:

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

O uso do método acima funciona muito bem, no entanto, parece que as regras dos campos personalizados avançados (outro plug-in popular) que dependem da categoria de postagem não são carregadas corretamente (ou seja, os campos personalizados dessa categoria não são carregados). Alguém imaginou uma solução alternativa para isso?
Aphire

9

Conecte-se wp_insert_post, teste o status da postagem auto-drafte o URL para um GETparâmetro.

Mas primeiro precisamos de uma função auxiliar para obter e higienizar o GETparâmetro:

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

Agora, o manipulador de rascunho automático:

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

Isso funciona apenas se tiver get_default_post_to_edit()sido chamado com o segundo parâmetro $create_in_dbdefinido como TRUE. Para capturar o outro caso, você precisa filtrar a opção default_category:

add_filter( 'pre_option_default_category', 't5_get_default_cat_by_url' );

Agora você pode usar o parâmetro post_catpara passar uma lista separada por vírgula de slugs de categoria:

insira a descrição da imagem aqui

Veja também:


Eu tentei esta solução colando o código no meu arquivo functions.php e não funcionou. Estou esquecendo de algo? Preciso fazer mais como chamar a função para fazê-la funcionar?
Jamie

@ Jamie Não funcionou é muito vago. :)
fuxia

Eu pensei adicionando o código no functions.php que quando eu marquei uma categoria, ele adicionaria esse parâmetro ao final da string, como na foto acima. Estou tentando adicionar um metabox a apenas uma categoria específica. Então usarei $ _GET para testar se estou na categoria correta para carregar o metabox. Quando tentei o código e tentei replicar o que está na sua foto acima, nada aconteceu. Tudo o que recebi foi wp-admin / post-new.php. Eu estou tentando obter wp-admin / pós-new.php post_cat = áudio?
Jamie

@ Jamie Este código funciona ao contrário: você cria o link manualmente (por exemplo, para enviá-lo a alguém por e-mail), e o código definirá a categoria apropriada. Não cria nenhum link.
fuxia

1

Eu acho que você pode ir sobre a opção padrão default_categorye filtrar option_default_categoryisso, se o URL tiver um parâmetro para a categoria, como esta fonte de exemplo. Use-o como plug-in, teste-o. Foi escrever a partir do zero e não testado.

O parâmetro url é post_cate você pode definir a categoria, assim: /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

Sei que isso já foi respondido, mas eu queria adicionar minha própria opinião. Adicionei-o a uma lista aqui https://gist.github.com/malcalevak/ba05b4fbed0c6e33ac8c18c1451sex57

Para evitar problemas, aqui está o código:

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

Semelhante a todos os outros, você o acionaria via /wp-admin/post-new.php?category=categoryname

Para sua informação, se você estiver usando campos personalizados avançados, como @Aphire, isso funcionará.


isso funciona se for um post simples. Se houver um parâmetro post_type, ele não funcionará. Como posso corrigir isso para reconhecer wp-admin / pós-new.php post_type = wpdmpro categoria = mycategory?
yurividal

@yurividal infelizmente, não tenho um ambiente configurado no momento, minha memória está obscura, mas uma rápida olhada no código do Gerenciador de Download do WordPress parece que o problema pode estar no fato de ele estar usando uma taxonomia personalizada que "parece" a taxonomia de categoria interna, mas não é.
Malcalevak

@yurividal não quis terminar o comentário. Você provavelmente precisará ajustar a função get_category_by_slug com uma para get_term_by e, em seguida, ajustar wp_set_post_terms para definir a taxonomia wpdmcategory personalizada.
Malcalevak 2/01/19

Uau, isso parece um pouco complicado e acho que não tenho habilidades php suficientes para isso. De qualquer forma, obrigado por sua ajuda, vou tentar aprofundar isso.
precisa saber é o seguinte

@yurividal Eu não acho que seria tão complicado, mas eu definitivamente poderia vê-lo como assustador para os menos iniciados com PHP e / ou WordPress. Se eu encontrar tempo de sobra, tentarei juntar algo, minha única preocupação é que não possa testá-lo no momento, o que tornaria o diagnóstico de problemas um pouco ... complicado.
Malcalevak
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.