WordPress usa comodines en get_posts

1 minuto de lectura

¿Es posible usar un comodín en la función get_posts()?

Ya hice la consulta que quería en SQL:

select * from wp_posts p
left join wp_postmeta pm on p.id = pm.post_id
where pm.meta_key like 'additional_downloads%' and pm.meta_value = 81 and p.post_status = "publish"

Lo que me da los resultados que quiero.

Luego intenté usar para hacer eso con la función integrada get_posts() en WordPress:

get_posts(array('meta_key' => 'additional_downloads%', 'meta_value' => 81))

Pero eso me da 0 resultados. La razón por la que necesito este comodín es porque una publicación puede tener más de 1 descarga adicional, y esas se almacenan en la tabla wp_postmeta con las meta_keys ‘additional_downloads_0’, ‘additional_downloads_1’, etc.

¿Alguna idea de cómo hacer esto usando las funciones de wordpress?

Podemos filtrar la WHERE cláusula de la consulta.

EL FILTRO

add_filter( 'posts_where', function ( $where, \WP_Query $q )
{ 
    // Check for our custom query var
    if ( true !== $q->get( 'wildcard_on_key' ) )
        return $where;

    // Lets filter the clause
    $where = str_replace( 'meta_key =', 'meta_key LIKE', $where );

    return $where;
}, 10, 2 );

LA CONSULTA

$args = [
    'suppress_filters' => false,
    'wildcard_on_key' => true,
    'meta_query' = [
        [
            'key' => 'additional_downloads_%',
            'value' => 81
        ]
    ]
];
$q = get_posts( $args );

  • ¡Excelente! No estaba al tanto de esta posibilidad de anular la funcionalidad de consulta, una forma agradable y limpia de hacerlo 🙂 ¡Gracias!

    – Danny vagabundo

    10 de febrero de 2016 a las 9:15

¿Ha sido útil esta solución?