Como obter um link de termo que cruze diferentes tipos de post personalizado?

4

No meu projeto WordPress, tenho vários custom post types diferentes e todos compartilham uma taxonomia comum . Estou no estágio final do projeto e agora é hora de vincular todos os tipos de postagem personalizados usando um widget da barra lateral. O problema que estou tendo é que eu não sei a maneira apropriada de obter o term link vinculado ao tipo de postagem personalizado correto.

Por exemplo, tenho tipos de postagem personalizados: livro, autor, produto; e uma taxonomia: gênero que inclui uma categoria de terror.

Gostaria de poder obter a estrutura de links como tal:

/book/genre/horror
/product/genre/horror
/author/genre/horror

Quando faço get_term_link('horror'); , recebo um dos links de termo, parece que um dos tipos de postagem personalizados tem preferência. Como posso obter o link de cada termo correspondente ao tipo de postagem personalizado correto?

Hard coding nunca é uma boa idéia, então eu queria saber se há uma maneira correta de fazer isso. Este é um problema antigo que estou tendo, e fiz muita pesquisa por uma solução, mas não a encontrei. Eu venho aqui como o último recurso. Obrigado.

    
por CodingCaio 25.06.2015 / 15:44

2 respostas

1

Este código exibe todas as postagens de todas as categorias de gênero taxonomia para o tipo de postagem personalizado . Agora, para diferentes tipos de post personalizado (author, product) você precisa alterar o Custom Type Type em $ arg de WP_Query (). Você receberá o termo link usando a função get_term_link ($ catterm) ou você pode use também get_the_term_list () .

 $args = array(
            'number'     => $number,
            'hide_empty' => $hide_empty,
            'include'    => $ids
        );

        $custom_categories = get_terms( 'genre ', $args );

        foreach ( $custom_categories as $catterm){

            $arg = Array( 
            'post_type' => 'book',
            'posts_per_page' => '-1',
            'post_status' => 'publish',
            'tax_query' => Array( Array ( 
            'taxonomy' => 'genre ' ,
            'terms' => $catterm->term_id
            )) );

        $loop = new WP_Query( $arg ); 
        global $post;
        while ( $loop->have_posts() ) : $loop->the_post();
        ?>

        <div class="gallery-content">
        <div class="entry-content">

        <?php 
         echo '<li>' . get_the_title() . '</li>';
         echo '<li><a href="'.get_term_link($catterm).'">'.$catterm->name.'</a></li>';   
        ?>  

        </div>
        </div>

       <?php endwhile;
        }   
        ?>
    
por KD DEVELOPER 08.07.2015 / 07:54
0

Boa notícia, eu descobri uma maneira de conseguir isso. Aqui está a minha solução.

Seguindo meu exemplo acima, mostrarei o que eu fiz para que example.com/book/genre/horror indicasse o tipo de postagem personalizada book , taxonomia genre e categoria horror .

Os permalinks devem ser ativados. Vá para Configurações > Permalinks para ativá-lo. Caso contrário, não faz sentido fazer isso. Então aqui vamos nós ...

1) Crie uma página chamada book (e slug book), anote a ID da página que foi gerada para aquela página depois que você a publicou, você precisará dela (você pode ver isso no seu URL, deve ser um ?post= com o ID da página.)

2) Agora precisamos criar uma reescrita para que possamos apontar o link para a página de modelo correta. Então, no seu arquivo functions.php (ou seu arquivo plugin, até você) você precisa adicionar este código:

function my_rewrite_rules() {

    add_rewrite_rule(
        'book/genre/([[A-Za-z0-9\-]+)?/?$',
        'index.php?page_id=1234&genre=$matches[1]',
        'top'
    );

    flush_rewrite_rules();
}
add_action( 'init', 'my_rewrite_rules' );

Agora, substitua 1234 pelo ID da página que você gerou para a página book . E vá para qualquer página do front end e recarregue-a.

Importante: você não deseja executar flush_rewrite_rules(); sempre que uma página é carregada em seu site. Esta é uma função pesada e vai atrasar as coisas para você. Você só precisa executá-lo uma vez no front end . Depois que você recarregar qualquer página no front-end, as regras de regravação serão liberadas e você poderá remover essa linha.

O que essa função faz é que, se uma URL tiver a estrutura de /book/genre/ANYTHING_HERE/ , o WordPress redirecionará o usuário para a página com o ID 1234 com os dados genre=ANYTHING_HERE . Observe que ANYTHING_HERE é filtrado por meio da expressão regular fornecida e só aceitará caracteres (maiúsculas e minúsculas) de a-z, números de 0 a 9 e traço (-).

3) Vá para a pasta do tema e crie um arquivo chamado page-1234.php (substituindo 1234 pelo seu ID da página, é claro). Agora, nesse arquivo, você pode fazer todo tipo de coisa divertida. Veja como você pode listar todos os livros por gênero :

<?php
get_header(); 

global $wp_query;
$genre = $wp_query->query_vars['genre'];

$args = array(
    'post_type' => 'book',
    'tax_query' => array(
        array(
            'taxonomy' => 'genre',
            'field'    => 'slug',
            'terms'    => $genre,
        ), ),
);

$books = new WP_Query( $args );
?>

<h1>Books of <?php echo $genre;?></h1>
<ul>
<?php foreach ( $books as $book ) : ?>
    <li><?php echo $book->post_title; ?></li>
<?php endforeach; ?>
</ul>

<?php get_footer(); ?>

Além disso, se você não estiver trabalhando com taxonomias, como genre neste exemplo, poderá usar suas tags personalizadas. By the way, o termo genre só funciona neste exemplo porque foi registrado como uma taxonomia. Se este não fosse o caso, você poderia adicionar uma nova tag ao WordPress, o que você gostaria, adicionando isso ao seu functions.php como tal:

function custom_rewrite_tag() {
  add_rewrite_tag('%food%', '([^&]+)');
}
add_action('init', 'custom_rewrite_tag', 10, 0);

Agora você substitui genre na etapa 2 pela tag food . Em seu page-1234.php , você pode obter o query_vars['food'] e manipulá-lo da maneira que desejar e executar solicitações como example.com/book/food/chocolate . Observe que alguns query_vars são reservados. Confira os recursos abaixo para eles.

Para finalizar, para que os links apontem para o tipo e a taxonomia personalizados corretos, você precisa de uma função personalizada. Esta é a única maneira que eu poderia pensar em fazer isso e é algo assim:

function get_books_category_link( $category_slug ) {

    $page = get_permalink( 1234 );
    $link = '';

    if ( '/%postname%/' == get_option('permalink_structure') ) {
        $link = $page . 'genre/' . $category_slug;
    } else {
        $link = add_query_arg( array( 'genre' => $category_slug ) , $page );
    }

    return $link;
}

E é isso! Espero que ajude. Algumas ótimas leituras abaixo, especialmente o artigo de Stephen Harris realmente fez a diferença no entendimento da API de reescrita. Obrigado.

Tuts + A API de reescrita: o básico

Regravar regra de regravação / adição de API

Vars de consultas do WordPress

    
por CodingCaio 07.07.2015 / 16:49