Малко помощ с една заявка

vinsbg

Registered
Имам една заявка в сърч форма на wordpress, но нещо не мога да нацеля скобите и гърми постояно.

Може ли някой да погледне и да помогне.. Това е заявката, която wordpress-a си я генерира сам:
Код:
SELECT DISTINCT SQL_CALC_FOUND_ROWS wpdu_posts.* 
FROM wpdu_posts , wpdu_hdflvvideoshare 
LEFT JOIN wpdu_term_relationships AS trel ON (wpdu_posts.ID = trel.object_id) 
LEFT JOIN wpdu_term_taxonomy AS ttax ON ( 
    ( ttax.taxonomy = 'category' OR ttax.taxonomy = 'post_tag' OR ttax.taxonomy = 'post_format' OR ttax.taxonomy = 'bp_member_type' OR ttax.taxonomy = 'bp-email-type' ) 
    AND trel.term_taxonomy_id = ttax.term_taxonomy_id
) 
LEFT JOIN wpdu_terms AS tter ON (ttax.term_id = tter.term_id) 
LEFT JOIN wpdu_comments AS cmt ON ( cmt.comment_post_ID = wpdu_posts.ID ) 
LEFT JOIN wpdu_postmeta AS m ON (wpdu_posts.ID = m.post_id) 
LEFT JOIN wpdu_users AS u ON (wpdu_posts.post_author = u.ID) 
WHERE 1=1 
AND  
    ( 
        (
            (
                (
                    (
                        (wpdu_posts.post_title LIKE '%driver%') 
                        OR (wpdu_posts.post_content LIKE '%driver%')
                    )
                ) 
                OR (
                    (tter.name LIKE '%driver%')
                ) 
                OR (
                    (tter.slug LIKE '%driver%')
                ) 
                OR (
                    (ttax.description LIKE '%driver%')
                ) 
                OR (
                    (m.meta_value LIKE '%driver%')
                ) 
                OR (
                    (wpdu_posts.post_excerpt LIKE '%driver%')
                ) 
                OR (
                    (
                        (cmt.comment_content LIKE '%driver%')
                    ) 
                    AND cmt.comment_approved = '1'
                ) 
                OR (
                    (u.display_name LIKE '%driver%')
                ) 
            )
        ) 
        AND (wpdu_posts.post_password = '') 
        AND wpdu_posts.post_type IN ('page', 'post', 'videogallery') 
        AND (wpdu_posts.post_status = 'publish' OR wpdu_posts.post_type = 'attachment' OR wpdu_posts.post_status = 'draft') 
        AND (wpdu_hdflvvideoshare.description LIKE '%driver%' GROUP BY wpdu_posts.ID) 
        AND post_type != 'revision'
    ) 
   
    AND post_status != 'future' ORDER BY wpdu_posts.post_title LIKE '%driver%' DESC, wpdu_posts.post_date DESC LIMIT 0, 10
В момента грешката е
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY wpdu_posts.ID) AND post_type != 'revision' ) ' at line 52
 
1. Старай се да отделяш имената на колоните и таблииците с апостров (`table`.`column`), защото Mysql има запазени думи, desc и description мисля, че са едни от тях. Може и да нее е това проблема сега, но го имай в предвид за напред.

2. Гледай какво ти показва грешката. Най-вероятно е от следното :

[sql]
AND (wpdu_hdflvvideoshare.description LIKE '%driver%' GROUP BY wpdu_posts.ID)
AND post_type != 'revision' [/sql]
- Всички полета са описани от коя таблица идват , само post_type не е, а трябва да е, защото сял не знае от къде искаш да вземеш това post_type.

3. Следи какви кавички слагаш и ги преценяй добре. Ако започваш стринга с двойни кавички, вътре слагай само единични, двойни използвай, за да отделяш php променливи и обратно.

Пробвай, дано съм помогнал ;) :?:
 
Аз ги отдеям принципно, но в случая съм добавил това във function.php
Код:
function vh_search_meta_data_join($join) {
	global $wpdb;
	// Only join the post meta table if we are performing a search
	if ( get_query_var( 's' ) == '' ) {
		return $join;
	}

	// Only join the post meta table if we are on the Contacts Custom Post Type
	if ( !in_array('videogallery', get_query_var( 'post_type' ) ) ) {
		return $join;
	}

	// Join the post meta table
	$join .= " LEFT JOIN ".$wpdb->prefix."hdflvvideoshare";

	return $join; 
}
function vh_search_meta_data_where($where) {
	global $wpdb;

	// Only join the post meta table if we are performing a search
	if ( get_query_var( 's' ) == '' ) {
		return $where;
	}

	// Only join the post meta table if we are on the Contacts Custom Post Type
	if ( !in_array('videogallery', get_query_var( 'post_type' ) ) ) {
		return $where;
	}

	// Get the start of the query, which is ' AND ((', and the rest of the query
	$startOfQuery = substr( $where, 0, 7 );
	$restOfQuery = substr( $where ,7 );

	// Inject our WHERE clause in between the start of the query and the rest of the query
	$where = $startOfQuery . "(" . $wpdb->prefix."hdflvvideoshare.description LIKE '%" . get_query_var( 's' ) . "%') OR " . $restOfQuery ." GROUP BY " . $wpdb->posts . ".ID";

	// Return revised WHERE clause
	var_dump($where);

	return $where;
}
И това ми генерира горната заявка... Пробвах директно да изтрия AND post_type != 'revision', но дава грешка пък на "AND post_status != 'future' ORDER BY"...
 
Подредбата ти е грешна.

GROUP е след WHERE.

Защото се изпълняват в следния ред:
Код:
FROM clause
WHERE clause
SELECT clause
GROUP BY clause
HAVING clause
ORDER BY clause

Трябва да си изкарал резултати, преди да ги group-неш.
 
Fakeheal каза:
vinsbg каза:
Целта е да join-а една таблица ( hdflvvideoshare ) към това query.

Ти не я join-ваш, ти просто селектираш от нея. Я опиши релациите си.
Използвам този плъгин:
https://wordpress.org/plugins/search-everything/

На него се опитвам към всичките му join-ове да добавя и този. Това му е в search-everything.php файла
http://pastebin.com/NwWF1Dp6
А това е което съм добавил в function.php в директорията на темата
Код:
function vh_search_meta_data_join($join) { 
   global $wpdb; 
   // Only join the post meta table if we are performing a search 
   if ( get_query_var( 's' ) == '' ) { 
      return $join; 
   } 

   // Only join the post meta table if we are on the Contacts Custom Post Type 
   if ( !in_array('videogallery', get_query_var( 'post_type' ) ) ) { 
      return $join; 
   } 

   // Join the post meta table 
   $join .= " LEFT JOIN ".$wpdb->prefix."hdflvvideoshare"; 

   return $join; 
} 
function vh_search_meta_data_where($where) { 
   global $wpdb; 

   // Only join the post meta table if we are performing a search 
   if ( get_query_var( 's' ) == '' ) { 
      return $where; 
   } 

   // Only join the post meta table if we are on the Contacts Custom Post Type 
   if ( !in_array('videogallery', get_query_var( 'post_type' ) ) ) { 
      return $where; 
   } 

   // Get the start of the query, which is ' AND ((', and the rest of the query 
   $startOfQuery = substr( $where, 0, 7 ); 
   $restOfQuery = substr( $where ,7 ); 

   // Inject our WHERE clause in between the start of the query and the rest of the query 
   $where = $startOfQuery . "(" . $wpdb->prefix."hdflvvideoshare.description LIKE '%" . get_query_var( 's' ) . "%') OR " . $restOfQuery ." GROUP BY " . $wpdb->posts . ".ID"; 

   // Return revised WHERE clause 
   var_dump($where); 

   return $where; 
}
А тази заявка минава в phpmyadmin-а, но не виждам как да я добавя...
Код:
SELECT DISTINCT 
SQL_CALC_FOUND_ROWS wpdu_posts. * 
FROM wpdu_posts, wpdu_hdflvvideoshare
WHERE 1 =1
AND (
		(
			(
				(
					(
						( wpdu_posts.post_title LIKE  '%Driver is DRUNK%' )
							OR ( wpdu_posts.post_content LIKE  '%Driver is DRUNK%')
					)
				)
					OR (	
							( wpdu_posts.post_excerpt LIKE  '%Driver is DRUNK%' )
					    )
			)
		)
		AND ( wpdu_posts.post_password =  '' )
		AND wpdu_posts.post_type
			IN ('page',  'post',  'videogallery')
				AND ( wpdu_posts.post_status =  'publish' OR wpdu_posts.post_type = 
				 'attachment' OR wpdu_posts.post_status =  'draft' )
				OR ( wpdu_hdflvvideoshare.description LIKE  '%Driver is DRUNK%')
				AND post_type !=  'revision'
	)
AND post_status !=  'future'
GROUP BY wpdu_hdflvvideoshare.vid
ORDER BY wpdu_posts.post_title LIKE  '%Driver is DRUNK%' DESC , wpdu_posts.post_date DESC
 
Не едитвай кода на плъгина директно, защото когато го ъпдейтнеш ще ти изчезнат всичките промени.

Въпросното hdflvvideoshare какво представлява? Някакъв специален тип постове или?
 
Fakeheal каза:
Въпросното hdflvvideoshare какво представлява? Някакъв специален тип постове или?
Да, поства видеа от youtube. Слага се тайтъл и описание.

В таблицата на поста ( wp_posts ) се записва в колона wp_content shortcode на видеото: [hdvideo id=155]

Описанието на видеото обаче се записва в тая таблица hdflvvideoshare. Дефолтната търсачка на wordpress търси в wp_posts, но аз искам да добавя и hdflvvideoshare, за да мога да търся и в описанието на видеото, а не само в заглавието.
 
Доколкото виждам в тоя плъгин може да се дефинират custom taxonomy searches. А щом видеата ти са вид постове (нищо, че отиват в друга таблица) би трябвало да може да ги включиш.

Другото, което може да направиш без да модифицираш кода на плъгина е да сложиш Custom Fields (metadata) към всяко видео и там да ти е описанието. Така ще търси и в тях направо. :)
 
Fakeheal каза:
Доколкото виждам в тоя плъгин може да се дефинират custom taxonomy searches. А щом видеата ти са вид постове (нищо, че отиват в друга таблица) би трябвало да може да ги включиш.

Би трябвало, но не ги включва. Ако търся дума, която е само в description колоната в hdflvvideoshare, а я няма в тайтъла или контента в posts таблицата не намира нищо...

В таблицата на видеата (hdflvvideoshare) се записва ID-то на поста.. някак по този начин дали не може да се query-не?
 
Добре и как ще стане без плъгина тогава? Той не е важен.. просто реших, че с него ще е малко по-лесно...
 
Когато се пуска нов пост ( събмитва видео от ю туб ) запазва заглавието, описанието и т.н. в hdflvvideoshare таблица.

В wp_posts таблица, където са всички постове запазва само shortcode към видеото(поста): [hdvideo id=155]

Търсачката на Wordpress по дефолт търси в таблица wp_posts и останалите. Аз искам, когато някой напише нещо в търсачката да търси и в hdflvvideoshare таблица... и в двете.

edit:

Разкарах го тоя плъгин и това е варианта, с който работи, както тебва
Код:
function vh_search_meta_data_join($join) {
	global $wpdb;

	// Only join the post meta table if we are performing a search
	if ( get_query_var( 's' ) == '' ) {
		return $join;
	}

	// Only join the post meta table if we are on the Contacts Custom Post Type
	if ( !in_array('videogallery', get_query_var( 'post_type' ) ) ) {
		return $join;
	}

	// Join the post meta table
	$join .= " LEFT JOIN ".$wpdb->prefix."hdflvvideoshare ON $wpdb->posts.ID = ".$wpdb->prefix."hdflvvideoshare.slug ";

	return $join;
}

function vh_search_meta_data_where($where) {
	global $wpdb;

	// Only join the post meta table if we are performing a search
	if ( get_query_var( 's' ) == '' ) {
		return $where;
	}

	// Only join the post meta table if we are on the Contacts Custom Post Type
	if ( !in_array('videogallery', get_query_var( 'post_type' ) ) ) {
		return $where;
	}

	// Get the start of the query, which is ' AND ((', and the rest of the query
	$startOfQuery = substr( $where, 0, 7 );
	$restOfQuery = substr( $where ,7 );

	// Inject our WHERE clause in between the start of the query and the rest of the query
	$where = $startOfQuery . "(" . $wpdb->prefix."hdflvvideoshare.description LIKE '%" . get_query_var( 's' ) . "%') OR " . $restOfQuery ." GROUP BY " . $wpdb->posts . ".id";


	// Return revised WHERE clause
	var_dump($where);
	return $where;
}
 

Back
Горе