WordPress wpdb вопрос - как отфильтровать ревизии? - PullRequest
1 голос
/ 24 ноября 2011

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

<?php

global $wpdb;
global $post;

$review_id = $post->ID;

if (get_post_type($review_id) == "features") {
   $assoc_id = get_post_meta($review_id, "associated_hosts_value", true);
  $review_id = intval($assoc_id);
}

$assoc = $wpdb->get_col("SELECT DISTINCT post_id from wp_postmeta WHERE (meta_key='associated_hosts_value') AND ((meta_value LIKE ',{$review_id},%') OR (meta_value LIKE '%,{$review_id},%') OR (meta_value = '{$review_id}') OR (meta_value LIKE '%,{$review_id}'));");

1 Ответ

1 голос
/ 25 ноября 2011

Редакция хранится в wp_posts в столбце post_type, поэтому вам нужно будет выполнить внутреннее объединение на wp_posts и запросить post_type NOT IN ('revision'):

"SELECT DISTINCT post_id from {$wpdb->postmeta} INNER JOIN {$wpdb->posts} ON ID = post_id WHERE post_type NOT IN ('revision') ..."

Кстати, вставка необработанных SQL-запросов в get_col - плохая практика, так как она делает вас уязвимыми для SQL-инъекций. Используйте $wpdb->prepare() как показано здесь:

http://codex.wordpress.org/Class_Reference/wpdb#Protect_Queries_Against_SQL_Injection_Attacks

Обратите внимание, что вам нужно будет экранировать %, используемый в операторах LIKE, изменив их на %% для работы в prepare().

Кроме того, вы не должны жестко кодировать имена таблиц WP в своих запросах. Класс wpdb хранит имена таблиц для использования при построении ваших запросов, т.е. $wpdb->posts, $wpdb->postmeta. Использование этих данных гарантирует, что ваш плагин всегда будет запрашивать правильные таблицы WP. Попробуйте свой код в многосайтовой установке, чтобы узнать, почему это важно.

...