posts2posts query usando o problema da matriz connected_items [closed]

3

Minha configuração é a seguinte

Eu tenho um tipo de post personalizado chamado 'events' e um tipo de post personalizado chamado 'genres' que eu linko com o plugin posts2Posts do scribu. Cada evento pode ter vários gêneros vinculados a ele.

O que eu gostaria de fazer

Em uma página de evento , eu gostaria de mostrar outros eventos relacionados com base nos gêneros que o evento atual tem.

O que eu acho que devo fazer

  1. Execute uma consulta que obtenha todos os IDs de gênero do evento atual
  2. Passe esses IDs em uma segunda consulta que encontre todos os eventos com um ou mais desses gêneros vinculados a ele

Eu tenho uma consulta p2p que gostaria de exibir todos os eventos que possuem um E / OU mais dos gêneros fornecidos em connected_items. Eu os passo como um array, assim como na documentação.

Para ilustrar meu resultado, digamos que

  • o event1 vinculou gêneros aos IDs de postagens 1240, 1241, 1242 e 1250
  • o event2 vinculou gêneros aos IDs de postagem 1240, 1241 e 1260
  • o event3 vinculou gêneros aos IDs de postagens 1241 e 1242

Na primeira consulta eu recebo todos os IDs de gênero, isso funciona.

A segunda consulta que recebe todos os eventos com os gêneros fornecidos (eu os passo como uma matriz):

$args = array(
        'connected_type' => 'genres_to_events',
        'connected_items' => array(1240,1241,1242),
        'post_status' => 'publish',
        'posts_per_page' => -1,
    );

$query = new WP_Query($args);

O problema é que a saída verifica cada conexão na matriz e, portanto, a saída da consulta é:

  • event1
  • event1
  • event1
  • event2
  • event2
  • event3
  • event3

Mas eu gostaria de produzir cada evento com base em um ou mais dos gêneros conectados a ele. Eu não acho que isso é explicado na documentação, alguma idéia?

    
por eskimo 27.08.2013 / 15:37

2 respostas

0

Ah, eu acho que entendi. Eu acho que o que você deveria fazer com o seu primeiro loop, é pegar os gêneros conectados como você diz. Então você deseja obter todos os eventos que estão relacionados a eles, então você deve reunir apenas os IDs (coletá-los em uma matriz) em um loop e, em seguida, usar array_unique() para remover todas as duplicatas. Use esse array limpo em um loop para obter apenas esses posts. Faz sentido?

Então, algo assim pode funcionar:

$args = array(
        'connected_type' => 'genres_to_events',
        'connected_items' => array(1240,1241,1242),
        'post_status' => 'publish',
        'posts_per_page' => -1,
    );

$query = new WP_Query($args);

$connected_out = array();

while($query->have_posts()) : $query->the_post();
    $connected_out[] = $post->ID;
endwhile;

$connected_out = array_unique($connected_out);
wp_reset_query();

$args = array(
    'post__in' => $connected_out;
);

$query = new WP_Query($args);
// go!
    
por GhostToast 29.08.2013 / 15:13
0

Estou postando isso como uma resposta, pois é parcialmente e porque preciso de mais caracteres do que os disponíveis nos comentários. Espero que esteja tudo bem: -).

Então, encontrei o problema posts_per_page depois de ler este post .

É possível passar argumentos para a função get_related , embora pareça que você tenha que modificar o núcleo p2p. O que eu fiz foi adicionar minha própria função get_related , chamada my_get_related .

O código é o seguinte:

public function my_get_related( $item, $extra_qv = array(), $output = 'raw' ) {
        $extra_qv['fields'] = 'ids';

        $connected = $this->get_connected( $item, $extra_qv, 'abstract' );

        $additional_qv = array( 'p2p:exclude' => _p2p_normalize( $item ), 'posts_per_page' => -1 );

        return $this->flip_direction()->get_connected( $connected->items, $additional_qv, $output );
    }

Eu adicionei isso em wp-content / plugins / posts-posts-no-core / direct-connection-type.php (a função get_related original está na linha 94).

Você pode ver o argumento 'posts_per_page' adicionado, mais pode ser facilmente adicionado ao separá-los por vírgulas.

Agora ainda tenho uma pergunta: como declarar essa função fora do arquivo principal do p2p? Eu não quero adicioná-lo lá, pois poderia sair pela culatra quando atualizar o plugin. Eu gostaria de adicioná-lo ao meu functions.php (eu uso o tema Roots assim que será em algum outro arquivo que funções.php mas é o mesmo que colocá-lo lá desde o arquivo eu vou colocá-lo em um incluir de functions.php).

Eu tentei public function my_get_related... e add_action('p2p_init', 'my_get_related') , mas isso não funciona.

Alguma idéia de como adicionar essa função fora do núcleo?

Acho que depois disso, o problema está finalmente resolvido: -)

    
por eskimo 30.08.2013 / 13:43