web-dev-qa-db-fra.com

Utilisation de l'opérateur de requête de taxe Wordpress LIKE

J'ai une couleur de taxonomie associée à un type de message personnalisé. Je liste tous les posts meta et la taxonomie dans un tableau. J'ai une option dans le tableau pour rechercher les publications correspondant à la valeur de recherche.

lorsque la clé de recherche est entrée, un appel ajax est effectué pour obtenir les publications.

c'est la requête pour obtenir tous les articles correspondant à la chaîne de recherche.

function get_query_posts_custom($post_id,$start,$length)  {
    //get_posts arguments
    $args =  array(
        'post_type'     => 'custom_post',
        'post_status'   => array('publish'),
        'numberposts'   => $length,
        'offset'        => $start,
        'orderby'       => 'menu_order',
        'order'         => 'asc',
        'post_parent'   => $_product->id
    );


    //get custom post taxonomy
    $taxonomies = (array) maybe_unserialize(get_post_meta( $post_id, 'post_taxonomy', true));
    if(empty($attributes)) {
        $taxonomies = array();
    }

    $meta_keys  = array('type','code','key');       
    if(!empty($search)) {
        foreach($meta_keys as $meta_key) {
            $meta_query[] = array(
                        'key'   => $meta_key,
                        'value' => $search,
                        'compare'   => 'LIKE';
                    );

        }

        $args['meta_query'] = $meta_query;
        $tax_query = array();

        foreach($taxonomies as $taxonomy) {
            $tax_query  = array(
                'taxonomy'  =>  $taxonomy;
                'field' =>  'slug';
                'terms' =>  $search;
                'operator'  => 'LIKE';
            );
        }
        if(count($tax_query)) {
            $args['tax_query'] = $tax_query;
        }
    }
    $results    = get_posts($args);
            return $results;
}

Comment obtenir les posts qui correspondent à la chaîne de recherche d'une taxonomie?

J'ai cherché la référence de la fonction wordpress qui indique que seul l'opérateur autorisé à tax_query est 'IN, NOT IN, OR et AND') puis-je utiliser l'opérateur LIKE?

1
B L Praveen

La seule option que vous avez est d'écrire votre propre code SQL dans le filtre posts_clauses , où vous obtenez un tableau de clauses JOIN, WHERE, ORDER, etc. que vous pouvez modifier, ajouter, supprimer, etc.

Une note MAJEURE MAJEURE à ce sujet est qu’il faut TOUJOURS utiliser la fonction globale $wpdb ' prepare , qui désinfectera toutes vos belles données. Vous ne souhaitez autoriser aucun type d'injection dans vos requêtes personnalisées de termes de recherche. :)

4
Eric Holmes

Comme indiqué dans d'autres réponses, vous ne pouvez pas simplement faire une recherche avec LIKE en utilisant tax_query.

Ce que vous pouvez faire est soit de modifier l'instruction SQL à l'aide de filtres comme suggéré par @Eric Holmes, qui est une technique avancée. Vous devez savoir ce que vous faites. Vous pouvez également créer une requête distincte, chargeant d’abord les termes de la taxonomie (en utilisant LIKE), puis chargeant les publications réelles.

Voici un exemple simple pour charger des publications en relation avec des termes correspondant à une variable LIKE avec la variable $search.

//  load the terms using LIKE
$termIds = get_terms([
    'name__like' => $search,
    'fields' => 'ids'
]);


//  load the posts using the found term IDs
$posts = get_posts([
    'tax_query' => [
        'relation' => 'OR',
        [
            'taxonomy' => 'yourtaxonomy',
            'field' => 'id',
            'terms' => $termIds,
        ],
        [
            'taxonomy' => 'othertaxonomy',
            'field' => 'id',
            'terms' => $termIds,
        ],
    ],
]);
2
Arvid

WP_Tax_Query respectivement le paramètre de taxonomie de WP_Query ou get_posts() prend uniquement ce qui suit pour l'argument operator:

Chaîne 'opérateur' (facultatif)
Valeurs possibles: 'AND', 'IN' ou 'NOT IN'.
Par défaut: 'IN'

Vous ne pouvez donc pas utiliser LIKE comme operator.

1
Nicolai