Вопрос по php, variables, loops, wordpress – Правильный синтаксис PHP для пользовательского цикла WP

1

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

On a page, there are options to sort alphabetically or chronologically:

<a href="?sort=date">Newest</a>
<a href="?sort=title">Alphabetical</a>

Sorting Code starts here, placed above the loop:

<?php $sort= $_GET['sort']; 
    if($sort == "title") { $order= "'orderby'=>'title','order'=>ASC'"; } 
    elseif($sort == "date") { $order= "'orderby'=>'date'"; } 
    else{ $order= "'orderby'=>'date','order'=>'DESC'"; } 
?>

note: I am pretty sure the problem lies above in the variable $order

Wordpress Loop Using Variable $order as an argument

<?php $loop = new WP_Query( array( $order, 'post_type' => 'films', 'post_parent' => 0, 'posts_per_page' => -1 ) ); ?>

<?php while ( $loop->have_posts() ) : $loop->the_post(); ?>

    Wordpress loop stuff here

<?php endwhile; ?>

Цикл отображает элементы правильно, но ссылки сортировки не работают. Этот код очень хорошо работает с query_posts, но я пытаюсь заставить это работать для WP_Query (выше). Есть идеи здесь?

UPDATEЭтот метод отлично работает с использованием query_posts, как показано ниже (но мне все еще нужно, чтобы он работал для WP_Query):

<?php $sort= $_GET['sort']; 
    if($sort == "title") { $order= "&orderby=title&order=ASC"; } 
    elseif($sort == "date") { $order= "&orderby=date"; } 
    else{ $order= "&orderby=date&order=DESC"; } 
?>

<?php $posts = query_posts($query_string . $order); ?>
<?php if(have_posts()) : while(have_posts()) : the_post(); ?>
       Wordpress Stuff Here
<?php endwhile; ?>
<?php endif; ?>

Ваш Ответ

1   ответ
1

WP_Query expects associative array of parameters (array('param' => 'value')), whereas query_posts accepts only "query strings" ("param=value&param=value"). You are mixing both options, that's why it doesn't work. You need to change $order variable to be array instead of string, for example: $order = array('orderby' => 'title', 'order' => ASC');.

Ответ выше не является полным и может вводить в заблуждение.WP_Query документы здесь:https://codex.wordpress.org/Class_Reference/WP_Query , Этот класс принимает оба стиля, но они должны быть несколько иными. Я не знаю, как именно это сделать, потому что это не написано в документации по классам, но вам лучше использовать массивы, поэтому:

if($sort == "title") { $order = array('orderby' => 'title', 'order' => 'ASC'); } 
elseif($sort == "date") { $order= array('orderby' => 'date'); } 
else{ $order= array('orderby' => 'date', 'order' => 'DESC'); } 

FYI для преобразования между двумя типами использования функцийparse_str(): http://php.net/manual/en/function.parse-str.php а такжеhttp_build_query(): http://www.php.net/manual/en/function.http-build-query.php .

Используйте строку из комментария выше.
Хорошо, я изменил переменные в массивы вместо строк. Теперь мне нужно передать массив $ order в WP_Query. Использование $ order не работает. Как бы я использовал parse_str () для того, чтобы передать массив? JCHASE11
использование$loop = new WP_Query(array_merge($order, array('post_type' => 'films', 'post_parent' => 0, 'posts_per_page' => -1))).
Это сделал это. Огромное спасибо тебе, Томаш. JCHASE11
это именно то, что у меня есть, мне просто нужна помощь, чтобы передать его в цикл JCHASE11

Похожие вопросы