programing

사용자 정의 Word에서 결과를 제외하는 방법분류 용어별 MySQL 쿼리 누름

magicmemo 2023. 3. 22. 20:59
반응형

사용자 정의 Word에서 결과를 제외하는 방법분류 용어별 MySQL 쿼리 누름

저는 'product-brand' 분류법에 'brand-slug'라는 용어가 없는 게시물만 보여드리고 싶습니다.

현재 쿼리가 필터를 적용하지 않습니다.

SELECT DISTINCT * FROM $wpdb->posts AS p
  LEFT JOIN $wpdb->postmeta AS meta ON p.ID = meta.post_id
  LEFT JOIN $wpdb->term_relationships AS rel ON rel.object_id = p.ID
  LEFT JOIN $wpdb->term_taxonomy AS tax ON tax.term_taxonomy_id = rel.term_taxonomy_id
  LEFT JOIN $wpdb->terms AS term ON tax.term_id = term.term_id
WHERE 1=1
    AND p.post_type = 'product' 
    AND p.post_status = 'publish' 
    AND p.post_title LIKE '%$trimmed%' OR (meta.meta_key = 'product_model' AND meta.meta_value LIKE '%$trimmed%') 
    AND (tax.taxonomy = 'product-brand' AND term.slug NOT IN ('$protected'))

위의 질문에서는 분류법이나 슬러그 조건식이 모두 작동하지 않는 것 같습니다.

어떤 도움이라도 감사합니다!

주의:

사용하지 않는 것 같습니다.$wpdb->prepare()SQL 주입의 위험이 있습니다.

또한 관련 OR 부품 주위에 괄호가 없기 때문에 초안이 표시되지 않습니다.

다른 방법:

하드코드된 SQL 쿼리를 작성하는 대신WP_Query클래스, 후크/케이블을 통한 약간의 수정이 있습니다.

예를 다음에 나타냅니다(PHP 5.4+).

$args = [ 
    '_meta_or_like_title' => $trimmed,        // Our new custom argument!
    'post_type'           => 'product',
    'post_status'         => 'publish',
    'meta_query'          => [
        [
            'key'     => 'product_model',
            'value'   => $trimmed,            // Your meta value
            'compare' => 'LIKE'
        ]
    ],
    'tax_query'    => [
        [
            'taxonomy'  => 'product-brand',
            'field'     => 'slug',
            'terms'     => $protected,        // Your terms array
            'operator'  => 'NOT IN'
        ]
    ]
];

관습이 있는 곳_meta_or_like_title인수는 여기서 다른 질문을 위해 작성한 약간 수정된 플러그인에서 지원됩니다.

플러그인:

<?php
/**
 *  Plugin Name:   Meta OR LIKE Title query in WP_Query
 *  Description:   Activated through the '_meta_or_like_title' argument of WP_Query 
 *  Plugin URI:    http://stackoverflow.com/a/31241416/2078474
 *  Plugin Author: Birgir Erlendsson (birgire)
 *  Version:       0.0.1
 */

add_action( 'pre_get_posts', function( $q )
{
    if( $title = $q->get( '_meta_or_like_title' ) )
    {
        add_filter( 'get_meta_sql', function( $sql ) use ( $title )
        {
            global $wpdb;

            // Only run once:
            static $nr = 0; 
            if( 0 != $nr++ ) return $sql;

            // Modify WHERE part:
            $sql['where'] = sprintf(
                " AND ( %s OR %s ) ",
                $wpdb->prepare( 
                    "{$wpdb->posts}.post_title LIKE '%%%s%%'", 
                     $wpdb->esc_like( $title ) 
                ),
                mb_substr( $sql['where'], 5, mb_strlen( $sql['where'] ) )
            );
            return $sql;
        });
    }
}, PHP_INT_MAX );

언급URL : https://stackoverflow.com/questions/31037739/how-to-exclude-results-from-custom-wordpress-mysql-query-by-taxonomy-term

반응형