Wordpress 3.3 tipo de postagem personalizado com /% postname% / permastruct?

9

Há post anterior com título similar, mas ele não olha para o WordPress 3.3, e isso é importante como o 3.3 anuncia de forma interessante: "Use a estrutura permalink do postname sem uma penalidade de performance"

O problema com o Wordpress 3.2 e versões anteriores era que primeiro ele procurava nomes de páginas e, em seguida, 404. Ele não verificava os tipos de postagens arbitrárias primeiro. 3.3 por outro lado deve procurar tipos de postagens, depois páginas e, finalmente, 404 (como anuncia esse recurso). Isso implica que os tipos de postagem personalizados sem slug devem ser simples , se não codificarem post_type=post em algum lugar.

Ainda não consigo encontrar uma solução específica para 3,3.

Pergunta : Como posso definir a estrutura permalink "/% postname% /" para qualquer tipo de postagem personalizada "xyz"?

Obrigado.

    
por Ciantic 01.01.2012 / 10:21

6 respostas

2

Isso não é feito facilmente no WP 3.3, a menos que você especifique que as regras de reescrita estejam no ponto correto e faça com que o wp_rewrite pense que regras detalhadas estão sendo usadas no front end. A turma abaixo 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' ) );
    
por prettyboymp 06.01.2012 / 23:17
1

Chaves do carro sagrado!

Eu acho que isso funciona . Quase funciona, é super simples, apenas uma linha:

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. Se você tentar isso em casa, depois de adicionar essa linha, vá para "Configurações" - > "Permalinks" e Salvar alterações, atualiza os permalinks.

Eu estava lendo o código-fonte WP register_post_type() e encontrei uma linha:

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

Escusado será dizer, mas sem slug eu concluí que deveria funcionar, e fez . Até mesmo a edição permalink abaixo do título no editor funciona corretamente!

Atualização: Isso quebra os permalinks da página, de volta à prancheta ...

    
por Ciantic 06.01.2012 / 11:20
1

resposta prettyboymp é quase o mesmo que eu tenho ontem, mas eu não estou feliz com isso. A resposta do prettyboymp tem uma falha, ele não funciona quando o /% postname% / está sendo usado simultaneamente em vários tipos de posts.

Aqui está minha resposta, que também analisa a estrutura atual e cria uma matriz de tipos de post para recorrer. Há uma falha nisso também, se dois tipos de post tiverem o mesmo slug e ambos forem /% postname% / então ele mostrará 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"));
    
por Ciantic 07.01.2012 / 13:43
1

Eu criei uma solução e não consegui encontrar um problema com ela. Por favor, tente me dizer se você encontrar um 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);
    } 
}

Altere "yemek" com o nome do seu tipo de postagem.

    
por Ünsal Korkmaz 12.02.2013 / 19:18
0

Este link deve responder à sua pergunta:

enlace

    
por weston deboer 06.01.2012 / 01:43
0

A resposta mais limpa que eu poderia fazer para isso (estou construindo um plugin que realmente precisa de um tipo de post personalizado sem qualquer slug principal) é usar um modelo de página personalizado em vez de usar um tipo de postagem personalizado.

Ao fazer isso, seu "tipo de postagem personalizado" pode ter URLs como / whatever sem ter que se preocupar em pisar na página ou postar permalinks.

Para fazer isso, acabei fazendo o seguinte:

  • Adicionando um modelo de página personalizado dentro do meu plug-in
  • Configurando o modelo de página para que ele possa ser selecionado no editor de páginas
  • Criação de caixas meta personalizadas que só aparecem no meu modelo de página

Isso me permitiu:

Os lados inferiores

É claro que, embora isso não pise na página nem publique links, há algumas desvantagens óbvias.

Nenhum arquivo Você não terá um arquivo (se quiser), embora isso possa ser resolvido criando outro modelo de página para desenhar um arquivo de todas as páginas usando seu modelo personalizado.

Gerenciado em páginas Você não consegue a boa navegação à esquerda no admin que agrupa todo o tipo de postagem.

Isso pode ser parcialmente resolvido adicionando um filtro à lista de páginas (para permitir a filtragem pelo modelo de página que está sendo usado), mostrando qualquer modelo de página usado em uma nova coluna, etc.

Dito isso, queria algo que não fizesse com que os usuários se perguntassem por que criaram uma nova página personalizada e descobriram que não conseguiam mais alcançar as páginas normais ou a nova página personalizada fazia com que uma página existente em seu site desaparecesse.

Eu sei que não é uma solução real , mas é uma alternativa que funcionou bem para as minhas necessidades.

    
por Privateer 18.02.2017 / 17:32