Какова альтернатива получению страницы по названию()?


Я пишу тему, в которой я хочу отображать информацию в нижнем колонтитуле, доступную только на странице шаблона. Я использовал get_page_by_title(), который хорошо работает, если вы знаете, как будет называться страница, но, на мой взгляд, он не очень динамичен, невозможно предсказать, как пользователь назовет страницу в вашей теме.

В своем исследовании я нашел функцию под названием get_all_page_ids(), которая возвращает численно индексированный массив идентификаторов с сайта. Эта функция была бы намного круче, если бы это был ассоциативный (или даже почтовый объект), но я отвлекся.

Я рассматривал возможность использования чего-то подобного:

$all_page_ids = get_all_page_ids();

foreach ($all_page_ids as $id) {
    // get_post() {@link https://developer.wordpress.org/reference/functions/get_post/}
    $post_object = get_post($id);

    // preg_match() {@link http://php.net/manual/en/function.preg-match.php}
    if(preg_match("/\b(contact)\b/i", $post_object->post_title)) {
        // do something here
    } else {
        // for readability
        continue;
    }
}

Однако это все еще создает проблему необходимости знать, что пользователь выбрал слово контакт в своем названии. Что, если они создали страницу под названием "Войти в контакт", которая является их страницей контактов? Это сломалось бы.

Итак, короче говоря, мой вопрос касается наилучшей практики для дизайнеров тем. Является get_page_by_title()лучшим способом получить идентификатор другой страницы, или есть способ объединить несколько функций/переменных, чтобы получить идентификатор другой страницы, не зная названия?

Или есть функции WordPress, которые выполняют такую тяжелую работу, или get_page_by_title() является единственной близкой функцией? Я подозреваю, что есть более хитрый, но лучший способ сделать это, у меня просто нет никаких идей. Спасибо за любую помощь, которую вы можете оказать в этом.

Author: mrClean, 2016-01-06

2 answers

Если вы не навязываете заголовок и, очевидно, не знаете идентификатор, единственный способ сделать это - позволить пользователю выбрать, какую страницу использовать, обычно это делается на странице параметров темы, но может быть сделано в костюмере или даже в рамках редактирования страницы

 6
Author: Mark Kaplun, 2016-01-06 15:45:34

Если ваша страница является шаблонной страницей, то вы можете использовать is_page_template($template_name)

В противном случае, как упоминал Марк, вам нужно создать опцию темы и предоставить пользователю решать.

Подробнее: https://codex.wordpress.org/Function_Reference/is_page_template

ОБНОВЛЕНИЕ

Я неправильно понял ваш вопрос. Вы можете получить все страницы, используя определенное имя шаблона, но опять же пользователь может создать более одной такой страницы с одним и тем же шаблоном, поэтому вы не уверены, какую из них выбрать выбирать.

 $args = array(
    'meta_key'         => '_wp_page_template',
    'meta_value'       => 'page-about.php',
    'post_type'        => 'page'
 );
 $posts_array = get_posts( $args );

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

Опять же, я считаю, что подход Марка лучше и безопаснее.

 3
Author: Laxmana, 2016-01-06 21:18:45