Мне нужно отфильтровать некоторые сообщения на основе пользовательского ввода.
Пользовательский ввод преобразуется в набор правил, например, так ...
[rule] => Array
(
[1] => Array
(
[field] => title
[cond] => doesnotcontain
[val] => test
)
[2] => Array
(
[field] => cat_id
[cond] => is
[val] => 58
)
[3] => Array
(
[field] => status
[cond] => isnot
[val] => close
)
[4] => Array
(
[field] => date
[cond] => is
[val] => 1
)
[5] => Array
(
[field] => title
[cond] => beginswith
[val] => t
)
[6] => Array
(
[field] => title
[cond] => doesnotbeginwith
[val] => s
)
)
Как видите, естьмножество разных правил, каждое из которых имеет разные условия, например, не содержит, есть, не начинается, и их гораздо больше, чем я не показал.
Я должен фильтровать сообщения в соответствии с этими правилами.
Вот начало моей функции, которую я создал для нее, с некоторыми фиктивными данными в ней ...
public function complex_filter( $query ) {
global $wpdb;
$rules = [
[
'field' => 'post_title',
'cond' => 'contains',
'val' => 'test'
],
[
'field' => 'id',
'cond' => 'isnot',
'val' => '4281'
],
];
$post_ids = [];
foreach ( $rules as $r ) {
switch ( $r['field'] ) {
case 'post_title':
if ( $r['cond'] == 'contains' )
$post_ids = $wpdb->get_col("select ID from $wpdb->posts where post_title LIKE '".$r["val"]."%' ");
break;
case 'id':
if ( $r['cond'] == 'isnot' ) {
$pos = array_search( $r['val'], $post_ids);
unset($post_ids[$pos]);
}
break;
default:
break;
}
}
$query->set( 'post__in', $post_ids );
return;
}
add_filter('pre_get_posts', 'complex_filter');
Есть более 10 вариантов, каждый с несколькими условиями, поэтому яуже обеспокоен, что это превратится в огромный блок кода.
Есть ли у кого-нибудь какие-либо предложения по ...
Как я могу использовать встроенный WP Queryфункции, чтобы я мог просто написать этот код в несколько строк?
Такое чувство, что я должен быть в состоянии сделать это проще, но это был единственный способ, которым мне удалось заставить его работать до сих пор.
Любая помощь приветствуется.Спасибо.