Suporte » Desenvolvendo com WordPress » Condição else não funciona

  • Nura

    (@archer-master)


    Quando eu adiciono fica meusite.com/noticias/tech/amd-ryzen-sera-lancado-em-marco

    O que eu quero é remover o ID caso não tenha uma categoria marcada

    Quando eu não adiciono nenhuma categoria a minha url fica assim: meusite.com/noticias/1/olamundo

    Como posso fazer pra retirar o id por rewrite. Alguém poderia me ajudar, obrigado!

    
    add_filter( 'post_type_link', 'my_post_type_link2', 99, 2 );
    function my_post_type_link2( $post_link, $post = null ) {
        $newlink = $post_link;
     
        if ( !empty($post) ) {
            $post_type = get_post_type($post->ID);
              
            if($post_type == "noticias") {
                $newlink = str_replace('%category%', $post->ID, $post_link);
            } else {
                $newlink = str_replace('%category%', '', $post_link);
            }
        }
         
        return $newlink;
    }
    add_action( 'generate_rewrite_rules', 'fix_noticias_category_pagination' );
    function fix_noticias_category_pagination( $wp_rewrite ) {
        unset($wp_rewrite->rules['noticias/([^/]+)/page/?([0-9]{1,})/?$']);
        $wp_rewrite->rules = array(
            'noticias/?$' => $wp_rewrite->index . '?post_type=noticias',
            'noticias/page/?([0-9]{1,})/?$' => $wp_rewrite->index . '?post_type=noticias&paged=' . $wp_rewrite->preg_index( 1 ),
            'noticias/([^/]+)/page/?([0-9]{1,})/?$' => $wp_rewrite->index . '?category_name=' . $wp_rewrite->preg_index( 1 ) . '&paged=' . $wp_rewrite->preg_index( 2 ),
        ) + $wp_rewrite->rules;
    }
    • Este tópico foi modificado 7 anos, 1 mês atrás por Nura.
    • Este tópico foi modificado 7 anos, 1 mês atrás por Nura.
    • Este tópico foi modificado 7 anos, 1 mês atrás por Nura.
Visualizando 15 respostas - 1 até 15 (de um total de 16)
  • Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Olá Nura, tudo bem?

    Já tentou alterar a estrutura de permalink nas Configurações para apenas “nome do post” (mesmo que esteja usando CPTs deve funcionar) ?

    Abraços

    Criador do tópico Nura

    (@archer-master)

    Bom dia, e muito obrigado por tentar me ajudar. A links permanentes do post está assim nas configurações,só com o /%postname%/, teria alguma forma de remover o id do post caso não exista a category do custom post type, faz 3 semanas que estou tentando resolver o problema, procurei em vários tópicos de outros sites e nada.

    queria fazer igual esse site, dá uma olhada por gentileza.

    quando tiver a category a url fica assim.
    www.animeunited.com.br/noticias/anime/hajimete-no-gal-ganha-imagem/

    e quando não tiver a category exibi
    www.animeunited.com.br/noticias/avex-pictures-proibe-vendas-de-seus-titulos-fora-do-japao/

    Tem como eu fazer assim, porque só conseguir deixar com o id do post caso não tenha category marcada.

    Agradeço

    • Esta resposta foi modificada 7 anos, 1 mês atrás por Nura.
    • Esta resposta foi modificada 7 anos, 1 mês atrás por Nura.
    • Esta resposta foi modificada 7 anos, 1 mês atrás por Nura.
    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Nura, se o permalink está correto, então não deveria estar aparecendo o ID.

    Verifica por favor se o SLUG do post está como você quer. As vezes, quando você cria um post (enquanto o permalink ainda é ID) o slug é criado como um número. Aí quando você muda a estrutura de permalink para postname, o postname (slug) se mantem como um número.

    Para alterar um slug, basta ir abaixo do título do post e salvar novamente.

    P.S.: estou considerando que você não está executando o código que postou no começo, então por favor, comente-o ou remova-o, se for o caso.

    • Esta resposta foi modificada 7 anos, 1 mês atrás por Mário Valney.
    Criador do tópico Nura

    (@archer-master)

    O slug está certo, o problema é que eu queria uma solução pra retirar o id do post caso não tivesse marcado uma categoria.

    Eu queria remover o id do post caso não houvesse a categoria marcada, o problema é que a condição else não tá funcionando.

    Fica assim quando não tem categoria
    http://localhost/wordpress/noticias/1/ola-mundo/
    Eu queria deixar a url assim: sem o ID do post quando não houver categoria selecionada
    http://localhost/wordpress/noticias/ola-mundo/
    Cpt Notícias com Categoria: Tech 
    http://localhost/wordpress/noticias/tech/amd-ryzen-em-marco/ 

    Código completo do custom post type:
    http://pastebin.com/qV8mGx0V.

    • Esta resposta foi modificada 7 anos, 1 mês atrás por Nura.
    • Esta resposta foi modificada 7 anos, 1 mês atrás por Nura.
    • Esta resposta foi modificada 7 anos, 1 mês atrás por Nura.
    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Agora com o código do CPT fica mais fácil de entender.

    Antes de tudo, tenta tirar o filtro post_type_link e vê se funciona.
    Não sei se o WordPress trata o %category% no slug sozinho.

    Estou chutando, mas uma possibilidade é que o WordPress troca o %category% pela categoria quanto existe e quando não existe o filtro está trocando %category% pelo ID do post…

    Uma confusão…

    Então tenta tirar o filtro e vê se funciona. Se não funcionar, então vamos fazer o seguinte:

    1 – Troca para ‘noticias/%category_if_exist%’
    (category_if_exist pode ser qualquer coisa que o WordPress não usa)

    2 – No filtro post_type_link vamos fazer o seguinte:

    add_filter( 'post_type_link', 'my_post_type_link2', 99, 2 );
    function my_post_type_link2( $post_link, $post = null ) {
    
        if ( ! empty( $post ) && $post->post_type === "noticias" ) {
            $category = get_the_terms( $post, 'category' );
            $category_if_exist = '';
    
            if ( $category ) {
                $category_if_exist = $category[0]->slug;
            }
            
            $post_link = str_replace( '%category_if_exist%', $category_if_exist, $post_link );
        }
         
        return $post_link;
    }

    E é isso! Acho que vai funcionar (não testei aqui, mas qualquer problema, me avise). Não esqueça de salvar os permalinks novamente para atualizar.

    • Esta resposta foi modificada 7 anos, 1 mês atrás por Mário Valney.
    Criador do tópico Nura

    (@archer-master)

    Não funcionou, teria que ser com category mesmo pois quando eu busco pelo custom post type noticias/tech ele não aparece. Error 404 quando uso category_if_exist
    com o category funciona normal o noticias/tech

    ficou assim a url sem a categoria
    http://localhost/wordpress/noticias//amd-ryzen-em-marco redireciounou para http://localhost/wordpress/noticias/amd-ryzen-em-marco e deu error 404

    Só preciso resolver esse problema quando não houver categoria marcada.

    • Esta resposta foi modificada 7 anos, 1 mês atrás por Nura.
    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Você não pode usar barra “/” no tipo de post.
    Algo está errado… Não deve existir o tipo de post “noticias/tech”.

    Agora se está falando da página de categoria, não iria existir mesmo não.
    A URL de categoria seria a mesma dos posts comuns, se estiver usando a mesma taxonomia.

    • Esta resposta foi modificada 7 anos, 1 mês atrás por Mário Valney.
    Criador do tópico Nura

    (@archer-master)

    Ah, sim, só tô com o problema da url quando não tiver a categoria selecionada pra não mostrar o id.

    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    A solução fácil seria ter uma categoria padrão e sempre usá-la quando não tiver outra (Off ou Notícias, por exemplo).

    Mas tenta aquele seu código inicial sem a função my_post_type_link2.

    Ela basicamente diz:

    if ( !empty($post) ) {
    Se $post não estiver vazio

    $post_type = get_post_type($post->ID);
    $post_type é o tipo de post do $post

    if($post_type == "noticias") {
    Se $post_type for ‘noticias’

    $newlink = str_replace('%category%', $post->ID, $post_link);
    O $newlink será o link do post, trocando %category% pelo ID do $post.

    Como você não quer o ID na URL, não faz sentido.

    • Esta resposta foi modificada 7 anos, 1 mês atrás por Mário Valney.
    • Esta resposta foi modificada 7 anos, 1 mês atrás por Mário Valney.
    Criador do tópico Nura

    (@archer-master)

    Tentei assim mas sem sucesso

    add_filter('post_type_link', 'noticias_permalink', 99, 4);
    function noticias_permalink($post_link, $post, $leavename, $sample) {
        if ($post->post_type == 'noticias') {
            global $post;
            $terms = get_the_terms($post->id, 'category');
            $term = $terms[0]->slug;
            $permalink = str_replace('noticias/%category%', 'noticias' . $term . '', $post_link);
        }
        return $permalink;
    }

    Vou deixar como está mesmo, se fosse reescrever a url pra retirar o post id é possível?

    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Você testou o que eu disse ali em cima?

    Sobre o código novo:
    – Não use global $post porque interfere no $post recebido pela função
    – Seria bom checar se $terms é falso (sem categoria)
    'noticias' . $term . '' não funciona porque falta a barra e não precisa da string vazia no final…
    – Ela não retorna nada, se não entrar no IF

    O código certo fica assim:

    add_filter( 'post_type_link', 'noticias_permalink', 99, 2 );
    function noticias_permalink( $post_link, $post ) {
        if ( $post->post_type == 'noticias' ) {
            $terms = get_the_terms( $post->id, 'category' );
            if ( $terms ) {
                $post_link = str_replace( 'noticias/%category%', 'noticias', $post_link );
            } else {
                $post_link = str_replace( 'noticias/%category%', 'noticias/' . $terms[0]->slug, $post_link );
            }
        }
    
        return $post_link;
    }
    • Esta resposta foi modificada 7 anos, 1 mês atrás por Mário Valney.
    Criador do tópico Nura

    (@archer-master)

    Testei os dois códigos mas também não deu certo, vou deixar com o post->ID mesmo quando não houver categoria.

    Agradeço pela ajuda

    • Esta resposta foi modificada 7 anos, 1 mês atrás por Nura.
    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Opa… na verdade meu IF estava ao contrário: você pode testar novamente? 😀

    O certo é:

    if ( $terms ) {
        $post_link = str_replace( 'noticias/%category%', 'noticias/' . $terms[0]->slug, $post_link );
    } else {
        $post_link = str_replace( 'noticias/%category%', 'noticias', $post_link );
    }
    • Esta resposta foi modificada 7 anos, 1 mês atrás por Mário Valney.
    Criador do tópico Nura

    (@archer-master)

    A url ficou certa só que aparece error 404 http://localhost/wordpress/noticias/testando-url

    Moderador Mário Valney

    (@mariovalney)

    WordPress Cleric of Fire

    Acho que isso acontece porque o WordPress considera que /%category%/ deva estar presente, por isso sugeri usar %category_if_exist% da primeira vez…

    Quando eu puder, vou tentar montar esse seu código para ver se consigo reproduzir a situação aqui e sugerir como corrigir.

    • Esta resposta foi modificada 7 anos, 1 mês atrás por Mário Valney.
Visualizando 15 respostas - 1 até 15 (de um total de 16)
  • O tópico ‘Condição else não funciona’ está fechado para novas respostas.