web-dev-qa-db-fra.com

Comment utiliser WP_Query pour obtenir une série d'articles avec des champs personnalisés contenant des chiffres avec des lettres?

Ce que j'essaye de faire

J'utilise WP_Query() pour obtenir des publications en fonction de leur plage, par exemple:

$args = array(
    'numberposts' => -1,
    'post_type' => 'page',
    'posts_per_page' => -1, 
    'meta_query' => array(
        'relation' => 'AND',
        array(
            'key' => 'parameters',
            'value' => 'width',
        ),
        array(
            'key' => 'value',
            'value' => array( '22mm', '55mm' ), // Can this be done when I'm using NUMERIC and BETWEEN?
            'type' => 'NUMERIC',
            'compare' => 'BETWEEN'
        )
    )
);

$the_query = new WP_Query( $args );

Dans le DB

Dans la base de données, mes valeurs sont stockées sous forme de chaînes, c'est-à-dire 22mm , 55mm , etc. .

Question

Comment puis-je dire à la requête de rechercher une plage et d'ignorer le mm dans 22mm ?

1
hitautodestruct

Intercepter la requête sur le filtre posts_where. Vous pouvez y remplacer les valeurs non numériques:

preg_replace( "/[^0-9,.]/", "", $yourMeta );

Ou dans un code (générique):

add_action( 'posts_where', 'wpse120784WhereDiameter', 100 );
function wpse120784WhereDiameter( $where )
{
    // If conditions here - only target the cases where we need it
    # if ( foo ) { etc.

    // Only run once for this single query
    remove_filter( current_filter(), __FUNCTION__ );

    $diameter = get_post_meta( ... );
    $where .= preg_replace( "/[^0-9,.]/", $diameter, $where );

    return $where;
}

Lorsque vous parvenez à cibler les diamètres en MM exacts que vous recherchez, l'appel Regex Search/Replace apparaîtra simplement dans la variable MM/Inch (quelle que soit l'unité existante).

Bien sûr, vous devez accéder aux valeurs post-méta (get_post_meta()) pour les cibler plus précisément dans la tâche de remplacement de Regex, mais cela devrait vous amener à votre objectif.

Je pense toujours que supprimer le MM de vos entrées serait beaucoup plus facile et meilleur que ce que vous essayez d’atteindre.

1
kaiser