2016-08-11 2 views
0

Я просто не могу найти ответ, и не могу найти похожие статьи для своих конкретных случаев (или я нашел, но не узнал их).Фильтр Wordpress pre_get_posts с расширенными настраиваемыми полями

Итак, у меня есть обычные сообщения в блоге, и у меня есть собственное имя поля «тег», где у меня есть только одно слово «музыка» (тег - это текстовый тип).

Мой PHP для выбора всех сообщений, которые имеют «музыку» в «метке» является:

add_filter('query_vars', function($vars) { 
$vars[] = 'tag'; 

return $vars; 
}); 


add_action('pre_get_posts', function ($query) { 
if (!empty($_GET)) { 

    if ($tag = get_query_var('tag', false)) { 
     $meta_query[] = array(
      'key' => 'tag', 
      'value'  => $tag, 
      'compare' => '=' 
     ); 
    } 

    $query->query_vars['meta_query'] = $meta_query; 
} 
}, 1); 

Теперь, когда я ввожу URL, например: локальный/MyBlog/тег = музыка ни один из постов не показывая, даже у меня есть несколько сообщений с «музыкой» в поле «тег». Сначала я хотел бы получить решение для этого простого случая, потому что я duno, что я делаю неправильно.

Кроме того, я хотел бы решить, хочу ли я сделать несколько значений в текстовом поле «тег», например: «музыка, фильм, поп, жизнь», поэтому, когда люди печатают в «жизненном фильме», они получают все сообщения с эти конкретные области. Спасибо и жаль, что большая стена текста, чем ожидалось. Любая помощь будет назначена.

ответ

0

Как я понимаю из вашего объяснения, «тег» - это обычное поле, а не таксономия. Поэтому вам не нужно проверять любой запрос var, просто используйте «мета-запрос», и все.

add_action('pre_get_posts', 'make_my_query'); 

function make_my_query($query) { 
    if (!is_admin() && !empty($_GET) && isset($_GET['tag']) && $query->is_main_query()) { 
    $query->set('meta_query', array(array(
     'key' => 'tag', 
     'value' => sanitize_text_field($_GET['tag']) 
    ))); 
    } 
} 

Если вы используете этот фрагмент, основной запрос на странице будет содержать только сообщения с настраиваемым полем ключа «меткой» и значением из $ _GET. Я добавил некоторые проверки, чтобы убедиться, что мы не просматриваем панель администратора, а измененный запрос - основной запрос на странице. В противном случае это может быть беспорядок. Также я дезинфицировал значение GET.

Теперь ваш второй вопрос. Это возможно, но нам нужно изменить наш фрагмент. Прежде всего, давайте решим, как люди будут просить несколько тегов? Я предпочитаю использовать запятые. Так что url будет выглядеть так: localhost/myblog /? Tag = музыка, фильм. Теперь перейдем к запросу WP:

add_action('pre_get_posts', 'make_my_query'); 

function make_my_query($query) { 
    if (!is_admin() && !empty($_GET) && isset($_GET['tag'] && $query->is_main_query()) { 
    $get_params = explode(',', $_GET['tag']); 
    $meta_query = array(
     'relation' => 'OR' 
    ); 
    foreach ($get_params as $param) { 
     $meta_query[] = array(
     'key' => 'tag', 
     'value' => sanitize_text_field($param) 
    ); 
    } 
    $query->set('meta_query', $meta_query); 
    } 
} 

Это все. Теперь люди, просящие сообщения с тегом «tag = film, music», будут видеть сообщения, которые имеют «фильм» или «музыкальное» значение поля «тег». Если вы хотите показывать сообщения, у вас есть только все, просим использовать теги, изменить «Отношение» от «OR» до «AND». Надеюсь, это поможет!

+0

благодарит вас за ответ, но все еще не работает, ни один из примеров. Теперь у меня нет регистрации вручную для acf внутри моих functions.php, я просто добавил их через панель администратора, возможно, мне нужно их зарегистрировать ..? Извините за то, что беспокоило вас, это кажется достаточно простым, но просто не работает для меня. –

0

EDIT: Я нашел актуальную проблему ... Я не могу назвать свое собственное поле «тег», потому что по какой-то причине www.example.com/?tag=music дает некоторую странную ошибку. Изменено имя настраиваемого поля во что-либо другое (например, теги), и оно работает. Странно, и я надеюсь, что кто-то найдет это полезным.

 Смежные вопросы

  • Нет связанных вопросов^_^