Фильтр WP-запросов от сложного набора правил - PullRequest
0 голосов
/ 24 февраля 2019

Мне нужно отфильтровать некоторые сообщения на основе пользовательского ввода.

Пользовательский ввод преобразуется в набор правил, например, так ...

[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функции, чтобы я мог просто написать этот код в несколько строк?

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

Любая помощь приветствуется.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...