¿Tipo de publicación personalizada de Wordpress 3.3 con /% postname% / permastruct?

9

Hay una publicación anterior con un título similar, pero no se ve en WordPress 3.3, y eso es importante ya que la publicidad 3.3 es interesante: "Usa la estructura de permalink de postnombre sin una penalización de rendimiento"

El problema con Wordpress 3.2 y anteriores era que primero aparecía en los nombres de las páginas, y luego en 404. Primero no verificaba los tipos de publicaciones arbitrarias. 3.3 por otro lado, debe buscar tipos de publicaciones, luego páginas, y finalmente 404 (ya que anuncia esta característica). Esto implica que los tipos de publicación personalizados sin slug deberían ser simples , si no tuvieran el código duro post_type=post en alguna parte.

Aún no puedo encontrar una solución 3.3 específica.

Pregunta : ¿Cómo puedo definir la estructura permalink "/% postname% /" para cualquier tipo de publicación personalizada dada "xyz"?

Gracias.

    
pregunta Ciantic 01.01.2012 - 10:21

6 respuestas

2

Esto no se hace fácilmente en WP 3.3 a menos que trates de reescribir las reglas para que estén en el lugar correcto y haga que wp_rewrite piense que las reglas verbales se están usando en el extremo delantero. La siguiente clase funciona.

class Test_Post_Type {
    const POST_TYPE = 'test';

    public static function init() {
        global $wp_rewrite;

        $post_type_obj = register_post_type( self::POST_TYPE, array(
            'labels' => array(
                'name' => __( 'Tests' ),
                'singular_name' => __( 'Test' ),
                'add_new' => __( 'Add New' ),
                'add_new_item' => __( 'Add New Test' ),
                'edit_item' => __( 'Edit Test' ),
                'new_item' => __( 'New Test' ),
                'all_items' => __( 'All Tests' ),
                'view_item' => __( 'View Test' ),
                'search_items' => __( 'Search Tests' ),
                'not_found' => __( 'No Tests found' ),
                'not_found_in_trash' => __( 'No Tests found in Trash' ),
                'menu_name' => __( 'Tests' )
            ),
            'publicly_queryable' => true,
            'exclude_from_search' => true,
            'hierarchical' => false,
            'public' => true,
            'rewrite' => false,
            'has_archive' => true,
            'supports' => array( 'title', 'editor', 'thumbnail', 'test_source' ),
            'taxonomies' => array( 'category', 'post_tag' ),
        ) );

        $post_type_obj = get_post_type_object(self::POST_TYPE);

        //register the rewrite tag for permalink building
        $wp_rewrite->add_rewrite_tag( '%' . $post_type_obj->query_var . '%', '([^/]+)', $post_type_obj->query_var . '=' );

        //we have to add the permastruct here in order to build the permalink, otherwise we'll need to filter the post_type link
        add_permastruct(self::POST_TYPE, '%' . $post_type_obj->query_var . '%/', false );

        //add a filter to remove the permastructs generated above
        add_filter(self::POST_TYPE . '_rewrite_rules', array(__CLASS__, '_remove_default_rules')); 

        //now we add a filter to put the generated rewrite rules in the correct spot
        add_action('generate_rewrite_rules', array(__CLASS__, '_filter_rewrite_rules'));

        if(!is_admin()) {
            //we need verbose_page_rules to be on on the front end in order for pages to be process properly
            $wp_rewrite->use_verbose_page_rules = true;
        }
    }

    /**
     * Filter to remove the rules for this post type when they're automatically generated due to the permastruct registration
     * @param type $rules
     * @return type 
     */
    public static function _remove_default_rules($rules) {
        return array();
    }

    /**
     * Filters the rules at the end to add back the ones for this post type at the bottom
     * @param WP_Rewrite $wp_rewrite 
     */
    public static function _filter_rewrite_rules($wp_rewrite) {
        $post_type_obj = get_post_type_object(self::POST_TYPE);
        $my_rules = $wp_rewrite->generate_rewrite_rules('%' . $post_type_obj->query_var . '%', EP_NONE);
        $wp_rewrite->rules += $my_rules;
    }

}

add_action( 'init', array( 'Test_Post_Type', 'init' ) );
    
respondido por el prettyboymp 06.01.2012 - 23:17
1

¡Santas llaves de coche!

Creo que esto funciona . Casi funciona, es super simple, solo una línea:

global $wp_rewrite;
$args = array(
    'public' => true,
    'publicly_queryable' => true,
    'show_ui' => true,
    'show_in_menu' => true,
    'query_var' => true,
    'rewrite' => array('slug' => 'anything'),
    'capability_type' => 'post',
    'has_archive' => true,
    'hierarchical' => false,
    'menu_position' => null,
    'supports' => array('title','editor','thumbnail')
);
register_post_type('my_custom_post_type', $args);

$wp_rewrite->add_permastruct('my_custom_post_type', "%my_custom_post_type%");

P.S. Si lo intentas en casa, después de agregar esta línea, ve a "Configuración" - > "Permalinks" y Guardar cambios, actualiza los permalinks.

Estaba leyendo el código fuente de WP register_post_type() y encontré una línea:

$wp_rewrite->add_permastruct($post_type, "{$args->rewrite['slug']}/%$post_type%", $args->rewrite['with_front'], $args->permalink_epmask);

No hace falta decirlo, pero sin la babosa, llegué a la conclusión de que debería funcionar, y funcionó . ¡Incluso la edición de enlace permanente debajo del título en el editor funciona correctamente!

Actualizar: Esto rompe los enlaces permanentes de la página, de vuelta al tablero de dibujo ...

    
respondido por el Ciantic 06.01.2012 - 11:20
1

La respuesta de prettyboymp es casi la misma que recibí ayer, pero no estoy contenta con eso. La respuesta de prettyboymp tiene un defecto, no funciona cuando /% postname% / se usa simultáneamente en varios tipos de publicaciones.

Aquí está mi respuesta, que también se refiere a la estructura actual, y crea una matriz de tipos de publicaciones a las que recurrir. Sin embargo, hay una falla en esto también, si dos tipos de publicación tienen la misma bala y ambos son /% postname% / entonces muestra ambos.

class MyCustomPostType {
    /**
     * Register post type
     **/
    public static function register_post_type() {
        global $wp_rewrite;

        $args = array(
            'public' => true,
            'publicly_queryable' => true,
            'show_ui' => true,
            'show_in_menu' => true,
            'query_var' => true,
            'rewrite' => false,
            'capability_type' => 'post',
            'has_archive' => true,
            'hierarchical' => false,
            'menu_position' => null,
            'supports' => array('title','editor','thumbnail')
        );

        register_post_type('my_custom_post_type', $args);

        // Enables the pages to work simultaneously
        $wp_rewrite->use_verbose_page_rules = true;
        add_filter("rewrite_rules_array", array(__CLASS__, 'rewrite_rules_array'));
        add_action("parse_query", array(__CLASS__, 'parse_query'));
        add_filter("post_type_link", array(__CLASS__, 'post_type_link'), 1, 4);
    }

    public static function post_type_link($link, $post, $leavename=false, $sample=false) {
        if ($sample && ($begin = strpos($link, "?my_custom_post_type=")) !== false) {
            return substr($link, 0, $begin-1) . "/%my_custom_post_type%/";
        }
        return str_replace("?my_custom_post_type=", "", $link) . "/";
    }

    public static function parse_query($query) {
        global $wp, $wp_rewrite;

        // Is this query for /%post_name%/? Is it main request query?
        if (isset($query->query['name'])
            && substr($wp->matched_rule, 0, 7) == "([^/]+)"
            && isset($query->query)
            && isset($wp->query_vars)
            && $query->query == $wp->query_vars)
        {
            //echo '<p><h1>hit!</h1></p>';
            if (!($post_types = get_query_var("post_type"))) {
                if ($wp_rewrite->permalink_structure == "/%postname%/")
                    $post_types = array("post");
                else
                    $post_types = array();
            }

            if (is_array($post_types))
                $post_types[] = "my_custom_post_type";

            set_query_var("post_type", $post_types);
            //set_query_var("posts_per_page", 1);
        }
    }

    public static function rewrite_rules_array($array) {
        global $wp_rewrite;
        // Same rules as in /%post_name%/
        return array_merge($array, $wp_rewrite->generate_rewrite_rules("/%postname%/", EP_PERMALINK));
    }
}


add_action('init', array("MyCustomPostType", "register_post_type"));
    
respondido por el Ciantic 07.01.2012 - 13:43
1

Creé una solución y no pude encontrar un problema con ella. Por favor, inténtame y dime si encuentras un problema

add_action('init', 'firmasite_resimlitarif_cpt', 0);
function firmasite_resimlitarif_cpt() 
{

// Yemek Tarifi

  $args = array(
    'public' => true,
    'show_in_menu' => true, 
    'permalink_epmask' => EP_NONE,
    'rewrite' => array('slug'=>'/','with_front'=>false),
    'has_archive' => false,
    'supports' => array('title','editor','thumbnail')
  ); 
  register_post_type('yemek',$args);

}


// http://wordpress.stackexchange.com/questions/37650/wordpress-3-3-custom-post-type-with-postname-permastruct
add_action("parse_query", 'firmasite_resimlitarif_parse_query');
function firmasite_resimlitarif_parse_query($query) {
    global $wp, $wp_rewrite;


    // Is this query for /%post_name%/? Is it main request query?
    if (isset($query->query['name'])
        && substr($wp->matched_rule, 0, 7) == "([^/]+)"
        && isset($query->query)
        && isset($wp->query_vars)
        && $query->query == $wp->query_vars)
    {
        if (!($post_types = get_query_var("post_type"))) {
            if ($wp_rewrite->permalink_structure == "/%postname%/")
                $post_types = array("post");
            else
                $post_types = array();
        }

        if (is_array($post_types)){ 
            $post_types[] = 'yemek';
            $post_types[] = 'page';
        }


        set_query_var("post_type", $post_types);
    } 
}

Cambia 'yemek' con tu nombre de tipo de publicación.

    
respondido por el Ünsal Korkmaz 12.02.2013 - 19:18
0

Este enlace debe responder a su pregunta:

enlace

    
respondido por el weston deboer 06.01.2012 - 01:43
0

La respuesta más limpia que podría encontrar para esto (estoy creando un complemento que realmente necesita un tipo de publicación personalizada sin ningún tipo de ataque) es usar una plantilla de página personalizada en lugar de usar un tipo de publicación personalizada.

Al hacer esto, su "tipo de publicación personalizada" puede tener direcciones URL como / lo que sea sin tener que preocuparse por entrar en la página o publicar enlaces permanentes.

Para hacer esto, terminé haciendo lo siguiente:

  • Agregar una plantilla de página personalizada dentro de mi complemento
  • Configuración de la plantilla de página para que pueda seleccionarse en el editor de página
  • Creando meta cajas personalizadas que solo aparecen en mi plantilla de página

Esto me permitió:

Los lados bajos

Por supuesto, si bien esto no aparece en los enlaces de la página o de la publicación, sí tiene un par de inconvenientes obvios.

Sin archivo No tendrá un archivo (si lo desea), aunque eso se puede resolver creando otra plantilla de página para dibujar un archivo de todas las páginas utilizando su plantilla personalizada.

Gestionado en páginas No obtiene la buena navegación de la izquierda en el administrador que agrupa todos los tipos de publicaciones juntos.

Esto podría resolverse parcialmente agregando un filtro a la lista de páginas (para permitirle filtrar por la plantilla de página que se está utilizando), mostrando cualquier plantilla de página utilizada en una nueva columna, etc.

Dicho esto, quería algo que no causara que los usuarios se preguntaran por qué crearon una nueva página personalizada y descubrieron que ya no podían llegar a las páginas normales o que la nueva página personalizada provocaba que una página existente en su sitio desapareciera.

Sé que no es una solución real , pero es una alternativa que funcionó muy bien para mis necesidades.

    
respondido por el Privateer 18.02.2017 - 17:32

Lea otras preguntas en las etiquetas