¿Cómo agregar categoría a: 'wp-admin / post-new.php'?

9

Quiero tener un enlace para crear una nueva publicación que establezca la categoría también.

Lo intenté wp-admin/post-new.php?post_category=12y wp-admin/post-new.php?cat=12, pero ninguno funcionó. También intenté usar el nombre en lugar del id de la categoría; que tampoco tuvo efecto.

¿Cómo creo un enlace a una nueva publicación con una categoría predeterminada?

A
fuente

Respuestas:

4

Dave James Miller, en GitHub, me clavó este. Nada del trabajo es mío, solo estoy publicando su código envuelto en un pingüino ya que funciona perfectamente como se anuncia:

<?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);
usuario67014
fuente
El uso del método anterior funciona muy bien, sin embargo, parece que las reglas de campos personalizados avanzados (otro complemento popular) que dependen de la categoría de publicación no se cargan correctamente (es decir, los campos personalizados para esa categoría no se cargan). ¿Alguien ha encontrado una solución para esto?
Aphire
9

Conéctese wp_insert_post, pruebe el estado de la publicación auto-drafty la URL de un GETparámetro.

Pero primero necesitamos una función auxiliar para obtener y desinfectar el 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'] ) );
}

Ahora el controlador de borrador 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' );
}

Esto funciona solo si get_default_post_to_edit()se llamó con el segundo parámetro $create_in_dbestablecido en TRUE. Para detectar el otro caso, debe filtrar la opción default_category:

add_filter( 'pre_option_default_category', 't5_get_default_cat_by_url' );

Ahora puede usar el parámetro post_catpara pasar una lista separada por comas de babosas de categoría:

ingrese la descripción de la imagen aquí

Ver también:

fuxia
fuente
Intenté esta solución pegando el código en mi archivo functions.php y no funcionó. ¿Me estoy perdiendo de algo? ¿Necesito hacer más como llamar a la función para que haga el trabajo?
Jamie
@Jamie no funcionó es demasiado vago. :)
fuxia
Al agregar el código en functions.php pensé que cuando marcaba una categoría, agregaría ese parámetro al final de la cadena como en la foto de arriba. Estoy tratando de agregar un metabox solo a una categoría específica. Luego usaré $ _GET para probar si estoy en la categoría correcta para cargar el metabox. Cuando probé el código e intenté replicar lo que está en tu foto de arriba, no pasó nada. Todo lo que obtuve fue wp-admin / post-new.php. Estoy tratando de obtener wp-admin / post-new.php? Post_cat = audio
Jamie
@Jamie Este código funciona al revés: crea el enlace manualmente (por ejemplo, para enviarlo a alguien por correo electrónico), y el código establecerá la categoría adecuada. No crea ningún enlace.
fuxia
1

Creo que puede elegir la opción predeterminada default_categoryy filtrar option_default_categoryesto, si la url tiene un parámetro para la categoría, como esta fuente de ejemplo. Úselo como complemento, pruébelo. Fue escrito desde cero y no probado.

El parámetro url es post_caty puede establecer la categoría, como esta 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' ) );
bueltge
fuente
0

Me doy cuenta de que esto ya ha sido respondido, pero quería agregar mi propia toma. Lo he agregado a una esencia aquí https://gist.github.com/malcalevak/ba05b4fbed0c6e33ac8c18c1451icsoft57

Sin embargo, para ahorrarle la molestia, aquí está el 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 );

Al igual que todos los demás, lo activaría a través de /wp-admin/post-new.php?category=categoryname

Para su información, si está utilizando campos personalizados avanzados, como @Aphire, esto funcionará.

Malcalevak
fuente
esto funciona si es una publicación simple. Si hay un parámetro post_type, no funciona. ¿Cómo puedo solucionar esto para reconocer wp-admin / post-new.php? Post_type = wpdmpro? Category = mycategory
yurividal
@yurividal desafortunadamente, no tengo un entorno configurado en este momento, mi memoria es borrosa, pero un vistazo rápido al código del Administrador de descargas de WordPress parece que el problema podría ser que está usando una taxonomía personalizada que "parece" la taxonomía de categoría incorporada, pero no lo es.
Malcalevak
@yurividal no quiso terminar el comentario. Es probable que deba ajustar la función get_category_by_slug con una para get_term_by y luego ajustar wp_set_post_terms para establecer la taxonomía wpdmcategory personalizada.
Malcalevak
Wow, eso suena un poco complicado y no creo que tenga suficientes habilidades de php para eso. De todos modos, gracias por tu ayuda, intentaré profundizar en eso.
yurividal
@yurividal No creo que sea tan complicado, pero definitivamente podría verlo como desalentador para los menos iniciados con PHP y / o WordPress. Si puedo encontrar tiempo de sobra, intentaré juntar algo, mi única preocupación es que actualmente no puedo probarlo, lo que haría que diagnosticar los problemas sea un poco ... complicado.
Malcalevak