Obtenga una sola publicación por un valor meta único

4

¿Hay una manera rápida de recuperar una publicación específica por un valor meta único? Podría ejecutar una meta_query y luego recorrer el primer valor para obtener la ID de la publicación, pero me pregunto si hay alguna otra que esté pasando por alto.

¿Es posible agregar una columna a la tabla wp_posts? ¿O hay alguna otra manera de agregar un segundo número único a cada publicación?

Para explicar debo tomar un pedido de WooCommerce (que es solo un tipo de publicación llamado 'shop_order') y enviarlo a un tercero y enviar una referencia única de su sistema, que hasta ahora he almacenado como meta . Normalmente, les enviaré la ID de la publicación como número de pedido, ya que cuando devuelven su información con la ID de la misma como número de pedido, es fácil configurar el meta de la publicación con la información adicional que envían.

Sin embargo, hay otro complemento (llamado números de orden secuencial) que filtra las ID de las publicaciones para mostrar siempre un número secuencial. Esto tiene mucho sentido desde un punto de vista legible por el hombre. Sin embargo, no puedo enviar este número de orden secuencial porque cuando me lo devuelvo, no puedo usar ese valor para update_post_meta , ya que no es ID de publicación en la base de datos. Si les envío la ID de la publicación real y las dos partes alguna vez tienen que hablar en persona, no harán referencia al mismo número de ID de pedido, lo que sería confuso, creo (muy parecido a esta pregunta).

Nuevamente, para intentar reafirmar mi pregunta ... ¿hay una forma más eficiente de obtener una publicación por un segundo valor único que no sea el ID de la publicación?

    
pregunta helgatheviking 18.01.2013 - 20:25

3 respuestas

2

Soy un estúpido increíble, ya que esto puede hacerse fácilmente con un simple WP_Query:


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

Sin embargo, decidí comparar el SQL real generado de get_posts () con una solución de filtro 'post_where' que es:


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)

con el SQL real generado de la nueva solución WP_Query () que es:


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)

Por lo tanto, ambas soluciones son aproximadamente igual de eficientes (la solución WP_Query () es probablemente un poco más rápida) pero ciertamente no es tan eficiente como el SQL generado por el hombre.

    
respondido por el 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() devuelve una matriz de todas las publicaciones del post_type especificado que tienen el meta_value especificado para la meta_key especificada, que será una matriz de 1 elemento si el meta_value es único.

    
respondido por el user27457 17.02.2013 - 14:46
0

Sí. $post->GUID es un segundo identificador. En realidad es un identificador único global designado por Wordpress. Ref: ¿Todas las identificaciones se utilizan como únicas?

Se puede hacer referencia de forma segura desde el servicio de terceros. Pero es posible que también desee mantener $post->ID como una copia de seguridad, en caso de que alguien manipule inadvertidamente el GUID (lo que podría ser más o menos probable): enlace

    
respondido por el Magne 25.11.2015 - 14:45

Lea otras preguntas en las etiquetas