Obter um único post por um valor meta único

4

Existe uma maneira rápida de recuperar uma postagem específica por um valor meta único? Eu poderia executar um meta_query e, em seguida, percorrer o primeiro valor para obter o ID do post, mas estou querendo saber se há algum outro que estou ignorando.

É possível adicionar uma coluna à tabela wp_posts? Ou existe alguma outra maneira de adicionar um segundo número único a cada postagem?

Para explicar, preciso pegar um pedido do WooCommerce (que é apenas um tipo de postagem chamado 'shop_order') e enviá-lo para um terceiro e eles enviam de volta uma referência exclusiva do sistema, que até agora armazenei como meta . Normalmente eu enviaria o ID do post como o número do pedido, porque quando eles enviam suas informações de volta com o ID do post como o número do pedido, é fácil configurar o post meta com as informações adicionais que eles enviam.

No entanto, existe outro plug-in (chamado de números Sequential Order), que filtra os códigos dos correios para mostrar sempre um número sequencial. Isso faz muito sentido do ponto de vista legível para humanos. No entanto, não posso enviar esse número de pedido sequencial porque, quando ele volta para mim, não posso usar esse valor para update_post_meta , já que ele não é um ID de postagem no banco de dados. Se eu enviar a ID do post real e os dois lados precisarem falar pessoalmente, eles não farão referência ao mesmo número de ID do pedido, o que seria confuso, eu acho (muito parecido com essa pergunta).

Então, mais uma vez, para tentar reafirmar minha dúvida ... existe uma maneira mais eficiente de obter uma postagem por um segundo valor exclusivo que não seja o ID do post?

    
por helgatheviking 18.01.2013 / 20:25

3 respostas

2

Eu sou apenas um idiota incrível aqui, pois isso pode ser feito facilmente com um simples WP_Query:


new WP_Query( array( 'post_type' => 'shop_order', 'meta_key' => $meta_key, 'meta_value' => $meta_value ) )

No entanto, decidi comparar a SQL gerada real de get_posts () com uma solução de filtro 'post_where' que é:


SELECT wp_posts.ID FROM wp_posts  WHERE 1=1  AND wp_posts.post_type = 'engine' AND ID IN (SELECT post_id FROM wp_postmeta WHERE meta_key = "horsepower" AND meta_value = "275")  ORDER BY wp_posts.post_date DESC LIMIT 0, 5
SELECT wp_posts.* FROM wp_posts WHERE ID IN (361,327)
SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (327,361)

com o SQL gerado real da nova solução WP_Query (), que é:


SELECT SQL_CALC_FOUND_ROWS  wp_posts.ID FROM wp_posts  INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) WHERE 1=1  AND wp_posts.post_type = 'engine' AND (wp_posts.post_status = 'publish' OR wp_posts.post_author = 1 AND wp_posts.post_status = 'private') AND ( (wp_postmeta.meta_key = 'horsepower' AND CAST(wp_postmeta.meta_value AS CHAR) = '275') ) GROUP BY wp_posts.ID ORDER BY wp_posts.post_date DESC LIMIT 0, 10
SELECT FOUND_ROWS()
SELECT wp_posts.* FROM wp_posts WHERE ID IN (361,327)
SELECT post_id, meta_key, meta_value FROM wp_postmeta WHERE post_id IN (327,361)

Portanto, ambas as soluções são igualmente eficientes (a solução WP_Query () é provavelmente um pouco mais rápida), mas certamente não é tão eficiente quanto a SQL gerada por humanos.

    
por user27457 18.02.2013 / 06:08
2
function get_post_by_meta_value( $meta_key, $meta_value ) {
  $post_where = function ($where) use ( $meta_key, $meta_value ) {
    global $wpdb;
    $where .= ' AND ID IN (SELECT post_id FROM ' . $wpdb->postmeta
      . ' WHERE meta_key = "' . $meta_key .'" AND meta_value = "' . $meta_value . '")';
    return $where;
  };
  add_filter( 'posts_where', $post_where );
  $args = array(
    'post_type' => 'shop_order',
    'post_status' => 'published',
    'post_per_page' => -1,
    'suppress_filters' => FALSE
  );
  $posts = get_posts( $args );
  remove_filter( 'posts_where' , $posts_where );
  return $posts;
} 

get_post_by_meta_value() retorna uma matriz de todas as postagens do post_type especificado que possuem o meta_value especificado para o meta_key especificado, que será uma matriz de 1 elemento se o meta_value for exclusivo.

    
por user27457 17.02.2013 / 14:46
0

Sim. $post->GUID é um segundo identificador. Na verdade, é o Identificador Exclusivo Globalmente designado do Wordpress. Ref: Todas as identificações usadas são exclusivas?

Ele pode ser referenciado com segurança em seu serviço de terceiros. Mas você pode querer manter $post->ID como backup também, no caso de alguém adulterar inadvertidamente o GUID (o que pode ser mais ou menos provável): enlace

    
por Magne 25.11.2015 / 14:45

Tags