Как использовать архив пользовательских типов записей в качестве главной страницы в WordPress? - PullRequest
2 голосов
/ 12 октября 2011

Я бы хотел использовать архив пользовательских типов записей в качестве главной страницы сайта, чтобы

 http://the_site.com/

- это архив пользовательских типов записей, отображаемый в соответствии с моим archive-{post-type}.php файлом.

В идеале я хотел бы изменить запрос, используя is_front_page() в моем файле functions.php. Я попробовал следующее, со страницей под названием «Домой» в качестве главной страницы:

 add_filter('pre_get_posts', 'my_get_posts');
 function my_get_posts($query){
     global $wp_the_query;
     if(is_front_page()&&$wp_the_query===$query){
        $query->set('post_type','album');
        $query->set('posts_per_page',-1);
     }
     return $query;
 }

но титульная страница возвращает содержимое "Home" и, похоже, игнорирует пользовательский запрос.

Что я делаю не так? Есть ли вообще лучший способ сделать это?

Примечание: я опубликовал это в Ответы WordPress , но это сообщество сравнительно невелико.

Ответы [ 4 ]

8 голосов
/ 06 мая 2013

Публикация окончательного решения в качестве ответа (Исаак поместил его в качестве комментария) только для тех, кто все еще ищет.

Исаак был на правильном пути с добавлением фильтра через functions.php.Он ошибся, позвонив по номеру is_front_page(), который пока не работает, потому что мы находимся в pre_get_posts, а запрос еще не выполнен.

Однако у нас есть идентификатор текущей страницы.Таким образом, мы все еще можем решить эту проблему, посмотрев в регистр опций WordPress опцию page_on_front, которая возвращает идентификатор страницы, которую пользователь установил в качестве главной страницы.

(Для обзора всех опций WordPress,просто зайдите <yourwordpressinstallation>/wp-admin/options.php в вашем браузере.)

Что делает для следующего решения в соответствии с предложением Ijaas :

add_action("pre_get_posts", "custom_front_page");
function custom_front_page($wp_query) {
    // Compare queried page ID to front page ID.
    if(!is_admin() && $wp_query->get("page_id") == get_option("page_on_front")) {

        // Set custom parameters (values based on Isaacs question).
        $wp_query->set("post_type", "album");
        $wp_query->set("posts_per_page", -1);

        // WP_Query shouldn't actually fetch the page in our case.
        $wp_query->set("page_id", "");

    }
}

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

Надеюсь, это кому-нибудь поможет.

Обновление: , как отмечено ниже , добавьте !is_admin() в выражение if, чтобы убедиться, что функция работает только на внешнем интерфейсе.Если вы хотите, чтобы это действие выполнялось только для начального запроса, вы также можете добавить проверку основного запроса $wp_query->is_main_query().

3 голосов
/ 06 января 2014

В ответ на решение Robberts:

ответил 6 мая '13 в 12: 04

добавляя && !isAdmin() к функции if, она заменяет запрос типа записи также для всех страниц администратора. На всякий случай, если у кого-то возникнут проблемы с этим.

редактирование: также добавление && $wp_query->is_main_query() к оператору if останавливает его, влияя на виджеты и меню

итого всего кода у меня

if($wp_query->get("page_id") == get_option("page_on_front") && !isAdmin() && $wp_query->is_main_query()) {}

0 голосов
/ 12 октября 2011

Исаак, вы правы, я не полностью прочитал ваш вопрос и предположил, что вы пытались сделать это «простым» способом.

В любом случае, я поставил ваш код на тестсайт и, действительно, это не сработало.Я посмотрел свой журнал SQL, и оказалось, что ваш код выдает его в запросе wp_posts.post_status = 'private'.

Итак, я попытался добавить строку $query->set('post_status', 'public'); в вашу функцию, и она работала просто отлично.

В общем, попробуйте это:

add_filter('pre_get_posts', 'my_get_posts');
function my_get_posts($query){
    global $wp_the_query;
    if(is_front_page()&&$wp_the_query===$query){
        $query->set('post_type','album');
        $query->set('posts_per_page',-1);
        $query->set('post_status', 'public');
    }
    return $query;
}
0 голосов
/ 12 октября 2011

Чтобы этот запрос работал, вам нужно добавить этот код в шаблон страницы, создать страницу, установить шаблон в качестве шаблона для только что созданной страницы, а затем установить эту страницу как Домашняя страница в Настройки => Чтение в админке.

Кстати, функция is_front_page() возвращает true, только если вы находитесь на странице, которая была задана в качестве домашней страницы из меню администратора.

Другой вариант - изменить index.php, но если вы это сделаете, is_front_page() всегда вернет false. В этом случае вы захотите использовать is_home().

Надеюсь, это поможет.

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