Получение записи по названию страницы или слагу

22 апр. 2011 г., 17:58:28
Просмотры: 19.2K
Голосов: 4

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

Я пробовал различные варианты, но без успеха. Этот способ кажется наиболее разумным, но он просто не работает.

<?php 
    $args = array(
    'pagename' => 'CM-145',
    'post_type' => 'page',
    'posts_per_page' => 1,
    'numberposts' => 1
); ?>
<div>
    <?php
        query_posts( $args );
        get_template_part( 'loop' );
        wp_reset_query();
    ?>
</div>

Цикл (Loop)

<?php if ( have_posts() ) while ( have_posts() ) : the_post(); ?>

                <div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
                    <?php if ( is_front_page() ) { ?>
                        <h2 class="entry-title"><?php the_title(); ?></h2>
                    <?php } else { ?>
                        <h1 class="entry-title"><?php the_title(); ?></h1>
                    <?php } ?>

                    <div class="entry-content">
                        <?php the_content(); ?>
                        <?php wp_link_pages( array( 'before' => '<div class="page-link">' . __( 'Страницы:', 'twentyten' ), 'after' => '</div>' ) ); ?>
                        <?php edit_post_link( __( 'Редактировать', 'twentyten' ), '<span class="edit-link">', '</span>' ); ?>
                    </div><!-- .entry-content -->
                </div><!-- #post-## -->

                <?php comments_template( '', true ); ?>

<?php endwhile; // конец цикла. ?>

Я также пробовал 'name' => 'CM-145', но не уверен, что это правильный или разумный способ выполнить эту операцию. В конечном итоге мне просто нужно получить миниатюру страницы и её краткое описание (excerpt), поэтому, если у вас есть лучшая идея, не стесняйтесь подсказать.

Заранее спасибо.

0
Все ответы на вопрос 2
8

Привет, @Zach Shallbetter:

Если я правильно понял ваш вопрос, то вы пытаетесь решить проблему с помощью функций темы, когда на самом деле вам нужно использовать API WordPress. Следующий код можно скопировать в файл test.php и запустить через http://yoursite.com/test.php, чтобы увидеть, как он работает (разумеется, заменив http://yoursite.com на домен вашего сайта!). Затем прочитайте комментарии, чтобы понять, куда вставить код для использования на вашем сайте:

<?php 

// Эту функцию нужно добавить в файл functions.php вашей темы
function get_excerpt( $post_id ) {
  $post = get_post( $post_id );
  $excerpt = $post->post_excerpt;
  return ( post_password_required($post) ? false : 
     apply_filters( 'get_the_excerpt', $excerpt ) );
}

include('../wp-load.php');

// Этот код размещается там, где нужно получить и вывести цитату и миниатюру
$post = get_page_by_path('CM-145');
$excerpt = get_excerpt($post->ID);
$thumbnail = get_the_post_thumbnail($post->ID);
?>
<div style="width:300px">
<span style="float:right;"><?php echo $thumbnail; ?></span>
<?php echo $excerpt ?>
</div>

Кроме того, меня немного беспокоит, что у вас может быть синдром "молотка и гвоздя" — когда у вас есть проблема, и в руках только молоток, вы пытаетесь решить её как гвоздь, хотя, возможно, вам нужна отвёртка?

Конкретно меня беспокоит, что вы используете Страницу для чего-то, что должно быть либо просто Настройкой, либо, возможно, Пользовательским типом записи. Не могли бы вы подробнее объяснить ваш сценарий использования и почему вы выбрали именно Страницу?

22 апр. 2011 г. 19:43:49
Комментарии

Абсолютно верно, в данный момент я работаю над http://redesign.openeye.net. Я сделал продукты в виде страниц, а все дополнительные элементы — в виде записей (видео, программное обеспечение, документы и т. д.). Эти элементы (записи) категоризированы по номеру модели, так что несколько записей могут быть связаны с одним номером модели. У нас есть ситуация, когда клиент заходит на страницу поддержки, выбирает категорию из выпадающего списка и затем видит список "записей", связанных с этим продуктом. Я бы хотел вывести изображение и описание страницы продукта в верхней части этой страницы.

Zach Shallbetter Zach Shallbetter
22 апр. 2011 г. 19:58:52

Кроме того, я активно использую пользовательские типы записей, поля и таксономии. Большая часть сайта генерируется автоматически. И, простите за инлайн-стили повсюду, я всё ещё работаю над дизайном.

Zach Shallbetter Zach Shallbetter
22 апр. 2011 г. 20:01:27

@Zach Shallbetter — Почему бы не создать пользовательские типы записей 'product' и 'add-on'?

MikeSchinkel MikeSchinkel
22 апр. 2011 г. 20:29:29

Потому что они будут конфликтовать со списками категорий, и мы вложили огромное количество времени, так что это не окупается, пока я не начну исправлять баги. Также постоянная ссылка выглядит красивее http://redesign.openeye.net/products/recorders/e-series/oe2-e480

Zach Shallbetter Zach Shallbetter
22 апр. 2011 г. 20:46:09

Для потомков, мне всё ещё интересно, почему его код, который должен работать (и, кстати, работает у меня), не работает.

Milo Milo
22 апр. 2011 г. 20:47:19

Не стесняйтесь поправлять мои выводы. Я в целом иду на ощупь в этом процессе.

Zach Shallbetter Zach Shallbetter
22 апр. 2011 г. 21:07:42

@Zach Shallbetter - Это вполне возможно сделать "красивые" URL с пользовательскими типами записей, просто к сведению.

MikeSchinkel MikeSchinkel
23 апр. 2011 г. 06:24:01

@Milo - Не уверен, спрашиваешь ли ты Зака или меня, и к какому именно коду ты обращаешься?

MikeSchinkel MikeSchinkel
23 апр. 2011 г. 06:24:32
Показать остальные 3 комментариев
4

Замените get_template_part( 'loop' ); на get_template_part( 'loop','page' ); или вручную вставьте цикл напрямую в этот шаблон и проверьте, в этом ли проблема. В остальном ваш код правильный.

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

22 апр. 2011 г. 18:37:10
Комментарии

Да, я тоже думал, что всё правильно, но вообще не возвращает никаких результатов. Даже если страница есть в шаблоне. Как минимум, должен возвращаться заголовок страницы. Интересно, может я что-то упускаю.

Zach Shallbetter Zach Shallbetter
22 апр. 2011 г. 19:14:46

Это весь твой цикл? Там не хватает the_post();

Milo Milo
22 апр. 2011 г. 19:17:10

Я создал страницу с заголовком "CM-145" и скопировал/вставил твой код. Когда я проверяю $wp_query, он действительно возвращается, но цикл, который ты привёл здесь, не работает без вызова the_post(); сначала. Для проверки я бы использовал print_r($wp_query);, чтобы понять, проблема в запросе или в цикле.

Milo Milo
22 апр. 2011 г. 19:26:03

Извините за плохую копию, это просто стандартный цикл

Zach Shallbetter Zach Shallbetter
22 апр. 2011 г. 19:26:14