фильтр wordpress posts_orderby с пользовательской таблицей в плагине

Я разрабатываю плагин Wordpress, и мне нужно упорядочить сообщения сайта с пользовательской таблицей, которую я создал с помощью своего плагина.

Я не хочу изменять код в теме, поэтому нашел в кодексе фильтры posts_orderby и posts_join (здесь: https://codex.wordpress.org/Custom_Queries).

Пользовательская таблица имеет следующие значения:

ID    slug    price 

и в файле плагина, куда я добавил эти строки:

add_filter('posts_orderby','custom_orderby');
add_filter('posts_join','custom_join');

function custom_join($join){
    global $wpdb;
    $customTable = $wpdb->prefix.'custom_table';

    if(!is_admin()){
        $join .= " LEFT JOIN $customTable ON $wpdb->postmeta.meta_value = $customTable.slug";
    }
    return $join;
}
function custom_orderby($orderby_statement){
    global $wpdb;
    $customTable = $wpdb->prefix.'custom_table';

    if(!is_admin()){
        $orderby_statement = "$customTable.price DESC"; 
    }
    return $orderby_statement;
}

Когда я обновляю страницу индекса, она выдает мне это сообщение об ошибке:

No Results Found

The page you requested could not be found. Try refining your search, or use the navigation above to locate the post.

Я попытался выполнить запрос непосредственно в моей базе данных с помощью этого кода:

SELECT * FROM wp_posts t1
    LEFT JOIN wp_postmeta t2 ON t1.ID = t2.post_id
    LEFT JOIN wp_custom_table t3 ON t2.meta_value = t3.slug

ORDER BY t3.price DESC

и это работает.

Итак, в коде, написанном в моем файле плагина, что-то не так, но я не могу понять это.


person DanieleBiggiogero    schedule 12.04.2013    source источник
comment
Хорошо, я частично решил свою проблему. Я добавил еще одну строку кода в функцию custom_join(). Теперь код такой: function custom_join($join){}   -  person DanieleBiggiogero    schedule 12.04.2013
comment
хорошо, я напутал с комментарием. Код такой: Хорошо, я частично решил свою проблему. Я добавил еще одну строку кода в функцию custom_join(). Теперь код такой: function custom_join($join){ global $wpdb; $customTable = $wpdb-›prefix.'custom_table'; if(!is_admin()){ $join .= ЛЕВОЕ СОЕДИНЕНИЕ wp_postmeta t1 ON wp_posts.ID = t1.post_id; $join .= ЛЕВОЕ СОЕДИНЕНИЕ $customTable t2 ON t1.meta_value = t2.slug; } вернуть $join; } Это работает, но есть другая проблема. Теперь я вижу, что некоторые сообщения дублируются.   -  person DanieleBiggiogero    schedule 12.04.2013


Ответы (1)


Хорошо, я решил это.

Проблема в том, что почтовый запрос не включает таблицу postmeta, поэтому я добавил ее в функцию custom_join, например так:

add_filter('posts_join','custom_join');
add_filter('posts_orderby','custom_orderby');

function custom_join($join){
    global $wpdb;
    $customTable = $wpdb->prefix."custom_table";

    if(!is_admin){
        $join .= "LEFT JOIN $wpdb->postmeta p1 ON $wpdb->posts.ID = p1.post_id";
        $join .= "LEFT JOIN $customTable p2 ON p1.meta_value = p2.slug";
    }

    return $join;
}

function custom_orderby($orderby_statement){
    global $wpdb;

    if(!is_admin){
        $orderby_statement = "p2.price DESC, $wpdb->posts.post_date DESC";
    }

    return $orderby_statement;
}

Я также добавил фильтр posts_groupby, потому что новый запрос дал мне дублированные сообщения (много дублированных сообщений).

Вот код:

add_filter('posts_groupby','custom_groupby');

function custom_groupby($groupby){
    global $wpdb;

    if(!is_admin){
       $groupby = "$wpdb->posts.ID";
    }

    return $groupby;
}

Все написано в файле плагина, но вы можете написать и в function.php файле вашей темы.

Не забудьте включить оператор if(!is_admin), если вы хотите, чтобы пользовательский запрос отображался только во внешнем интерфейсе.

person DanieleBiggiogero    schedule 13.04.2013