WordPress - форум поддержки пользователей | русский ВордПресс

Помощь пользователям русского ВордПресс (WordPress)

Вы не зашли.

Объявление

#1 02.10.2010 09:52:30

hubetov
Блогер
Зарегистрирован: 02.10.2010
Сообщений: 20

Право читать "запланированные" посты.

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

Код:

                    <?php $popular = new WP_Query('post_status=future&order=ASC&post_type=post'); ?>
                    <?php if ($popular->have_posts()) : ?>
                    
                            <?php while ($popular->have_posts()) : $popular->the_post(); ?>
                            <p>
                                <SMALL><strong><?php echo maxsite_the_russian_time(the_time('j F Y'))."</strong>, начало в ".get_the_time(); ?> </small><br>
                                <a href="<?php the_permalink(); ?>" title="Перейти к прочтению: <?php the_title(); ?>"><?php the_title(); ?></a><br>
                                <small>
                                <?php the_tags( '<span id="gray">Тэги: ', ', ', '</span>' ); ?>
                                </SMALL>
                            </p>
                            <?php endwhile; ?>
                        
                    <?php endif; ?>

И тут появляется проблема:

Под админом - я могу из читать, ели же захожу на сайт как обычный посетитель - не могу. Как это можно изменить?
Спасибо.

Неактивен

 

#2 02.10.2010 12:37:43

SkyWriter
Администратор
Зарегистрирован: 26.01.2009
Сообщений: 541

Re: Право читать "запланированные" посты.

Самый простой вариант, который пришел мне в голову, - это изменить ядро так, чтобы оно не присваивало статус будущих постов, а давало им статус "publish". Тогда все проблемы такого рода исчезнут.

С другой стороны появятся другие: Ваши посты будут показываться там, где раньше не показывались, и придется везде в теме менять запрос на посты на более сложный. Зато обойдетесь 1-ой строчкой модификации в ядре.

Ах, да... Есть еще вот такая вот вещь: http://wordpress.org/extend/plugins/upcoming-posts/ , может, подойдет?

Неактивен

 

#3 02.10.2010 13:05:52

hubetov
Блогер
Зарегистрирован: 02.10.2010
Сообщений: 20

Re: Право читать "запланированные" посты.

Я не очень силен в wordpress, потому в начале хочу спросит:

Возможно ли использовать для вывода в шаблоне single.php не стандартные функции а, скажем, перехватывать строку запроса в базу, делать этот запрос самому, через WP_Query, и вставлять конетент? Либо, вообще через mysql query? Что скажете?

SkyWriter, спасибо. Первый вариант не подойдет, а вот второй может. Буду пробовать.

Неактивен

 

#4 02.10.2010 13:24:26

SkyWriter
Администратор
Зарегистрирован: 26.01.2009
Сообщений: 541

Re: Право читать "запланированные" посты.

Да, возможно.

Вот, например, код, который выведет три ближайших будущих поста из выбранной категории:

Код:

<?php
$now = gmdate('Y-m-d H:i:59');

$pageposts = $wpdb->get_results ("SELECT * FROM wp_posts, wp_term_relationships 
WHERE wp_term_relationships.object_id = wp_posts.ID AND wp_term_relationships.term_taxonomy_id = '3' 
AND wp_posts.post_status = 'publish' && wp_posts.post_category = '0' AND
wp_posts.post_type = 'post' AND wp_posts.post_date_gmt > '".$now."' order by post_date asc limit 3");

foreach ($pageposts as $post):
  setup_postdata($post);
?>

  <h3>
    <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>">
      <?php the_title(); ?>
    </a>
  </h3>
  <p class="date"><?php the_time('F jS, Y') ?></p>
  <?php the_excerpt(); ?>

<?php endforeach; ?>

Неактивен

 

#5 02.10.2010 14:36:07

hubetov
Блогер
Зарегистрирован: 02.10.2010
Сообщений: 20

Re: Право читать "запланированные" посты.

Выводить такие данные у меня получается (в сайдбаре либо еще где-то).
блокируется же сам переход на страницу поста... Когда переходишь по "permalink".

Неактивен

 

#6 02.10.2010 14:59:40

SkyWriter
Администратор
Зарегистрирован: 26.01.2009
Сообщений: 541

Re: Право читать "запланированные" посты.

Код в ядре (query.php) подсказывает, что это без особых плясок (т.е. изменения кода ядра) сделать не получится, имхо:

Код:

if ( ('publish' != $status) ) {
    if ( ! is_user_logged_in() ) {
        // User must be logged in to view unpublished posts.
        $this->posts = array();
    } else {

Ну, или в single.php повторите код получения постов вручную, исправив его в части проверки на тип поста.

Неактивен

 

#7 02.10.2010 16:21:06

hubetov
Блогер
Зарегистрирован: 02.10.2010
Сообщений: 20

Re: Право читать "запланированные" посты.

Ага... вот оно как...

single.php не подхватывается, а подхватывается 404.php :) $query_string хранит все что нужно.

Насколько корректно будет делать обработчик для такого рода постов в файле 404? ))))))

Неактивен

 

#8 02.10.2010 16:31:17

SkyWriter
Администратор
Зарегистрирован: 26.01.2009
Сообщений: 541

Re: Право читать "запланированные" посты.

Все бы хорошо, но 404 еще и код ответа HTTP 404 выводит. Посты не будут индексироваться поисковиками, а некоторые браузеры будут заменять страницу 404 своими.

Неактивен

 

#9 02.10.2010 16:42:00

hubetov
Блогер
Зарегистрирован: 02.10.2010
Сообщений: 20

Re: Право читать "запланированные" посты.

Нууу.... Я в печали.

Неактивен

 

#10 02.10.2010 16:51:07

SkyWriter
Администратор
Зарегистрирован: 26.01.2009
Сообщений: 541

Re: Право читать "запланированные" посты.

А чего плохого в изменении движка? Т.е. это плохая практика, но никто не умрет, если под Ваш проект его нужно будет поменять :)

Неактивен

 

#11 03.10.2010 14:15:06

hubetov
Блогер
Зарегистрирован: 02.10.2010
Сообщений: 20

Re: Право читать "запланированные" посты.

Ну... тогда я попробую :)

Неактивен

 

#12 03.10.2010 14:19:23

hubetov
Блогер
Зарегистрирован: 02.10.2010
Сообщений: 20

Re: Право читать "запланированные" посты.

Решил проконсультироваться: :) правильно?
У меня WordPress 3.0.1.

Было:

       

Код:

        // Check post status to determine if post should be displayed.
        if ( !empty($this->posts) && ($this->is_single || $this->is_page) ) {
            $status = get_post_status($this->posts[0]);
            $post_status_obj = get_post_status_object($status);
            //$type = get_post_type($this->posts[0]);
            if ( !$post_status_obj->public ) {
                if ( ! is_user_logged_in() ) {
                    // User must be logged in to view unpublished posts.
                    $this->posts = array();
                } else {
                    if  ( $post_status_obj->protected ) {
                        // User must have edit permissions on the draft to preview.
                        if ( ! current_user_can($edit_cap, $this->posts[0]->ID) ) {
                            $this->posts = array();
                        } else {
                            $this->is_preview = true;
                            if ( 'future' != $status )
                                $this->posts[0]->post_date = current_time('mysql');
                        }
                    } elseif ( $post_status_obj->private ) {
                        if ( ! current_user_can($read_cap, $this->posts[0]->ID) )
                            $this->posts = array();
                    } else {
                        $this->posts = array();
                    }
                }
            }

            if ( $this->is_preview && current_user_can( $edit_cap, $this->posts[0]->ID ) )
                $this->posts[0] = apply_filters_ref_array('the_preview', array( $this->posts[0], &$this ));
        }

Стало:

Код:

        
        // Check post status to determine if post should be displayed.
        if ( !empty($this->posts) && ($this->is_single || $this->is_page) ) {
            $status = get_post_status($this->posts[0]);
            $post_status_obj = get_post_status_object($status);
            //$type = get_post_type($this->posts[0]);
            if ( !$post_status_obj->public ) {
                {
                    {
                        {
                            $this->is_preview = true;
                            if ( 'future' != $status )
                                $this->posts[0]->post_date = current_time('mysql');
                        }
                    } 
                }
            }

            if ( $this->is_preview && current_user_can( $edit_cap, $this->posts[0]->ID ) )
                $this->posts[0] = apply_filters_ref_array('the_preview', array( $this->posts[0], &$this ));
        }

Лишнего не убрал? )))

Неактивен

 

#13 03.10.2010 14:22:07

hubetov
Блогер
Зарегистрирован: 02.10.2010
Сообщений: 20

Re: Право читать "запланированные" посты.

О... так правильнее ?)

Код:

        // Check post status to determine if post should be displayed.
        if ( !empty($this->posts) && ($this->is_single || $this->is_page) ) {
            $status = get_post_status($this->posts[0]);
            $post_status_obj = get_post_status_object($status);
            //$type = get_post_type($this->posts[0]);
            if ( !$post_status_obj->public ) {
                if ( ! is_user_logged_in() ) {
[b]                         $this->is_preview = true;
                            if ( 'future' != $status )
                            $this->posts[0]->post_date = current_time('mysql');[/b]
                } else {
                    if  ( $post_status_obj->protected ) {
                        // User must have edit permissions on the draft to preview.
                        if ( ! current_user_can($edit_cap, $this->posts[0]->ID) ) {
                            $this->posts = array();
                        } else {
                            $this->is_preview = true;
                            if ( 'future' != $status )
                                $this->posts[0]->post_date = current_time('mysql');
                        }
                    } elseif ( $post_status_obj->private ) {
                        if ( ! current_user_can($read_cap, $this->posts[0]->ID) )
                            $this->posts = array();
                    } else {
                        $this->posts = array();
                    }
                }
            }

            if ( $this->is_preview && current_user_can( $edit_cap, $this->posts[0]->ID ) )
                $this->posts[0] = apply_filters_ref_array('the_preview', array( $this->posts[0], &$this ));
        }

Неактивен

 

#14 03.10.2010 21:15:16

SkyWriter
Администратор
Зарегистрирован: 26.01.2009
Сообщений: 541

Re: Право читать "запланированные" посты.

Я бы поправил в том месте, где ему присваивается future при создании. Имхо, было бы понятнее, а главное - короче. Но не забывайте про сторонние эффекты, которые Вы приобретете в результате, о них я писал ранее.

Неактивен

 

#15 04.10.2010 06:47:07

hubetov
Блогер
Зарегистрирован: 02.10.2010
Сообщений: 20

Re: Право читать "запланированные" посты.

Спасибо за помощь. Все вроде учел. Буду переходить к следующим этапам :)

Неактивен

 

#16 05.10.2010 18:43:54

hubetov
Блогер
Зарегистрирован: 02.10.2010
Сообщений: 20

Re: Право читать "запланированные" посты.

Вот первый "побочный эффект" - с комментами нужно такую же процедуру сделать :)

Неактивен

 

#17 06.10.2010 10:45:55

hubetov
Блогер
Зарегистрирован: 02.10.2010
Сообщений: 20

Re: Право читать "запланированные" посты.

А вот и второй вопрос созрел :(
Долго пытался разобраться в Google XML sitemap generator-е, чтоб он добавлял "future" посты в карту, но так и не получается это реализовать.
Можете помочь?

Неактивен

 

#18 07.10.2010 11:20:40

hubetov
Блогер
Зарегистрирован: 02.10.2010
Сообщений: 20

Re: Право читать "запланированные" посты.

Для Google Sitemap generatora делаем следующее:
Файл: sitemap-core
В нем "раздел": //Add the posts

Там ищем:

Код:

            if($this->GetOption('in_posts')) {
                //WP < 2.1: posts are post_status = publish
                //WP >= 2.1: post_type must be 'post', no date check required because future posts are post_status='future'
                if($wpCompat) $where.="(post_status = 'publish' AND post_date_gmt <= '" . gmdate('Y-m-d H:i:59') . "')";
                else $where.=" (post_status = 'publish' AND (post_type = 'post' OR post_type = '')) ";
            }

И... меняем на:

Код:

            if($this->GetOption('in_posts')) {
                //WP < 2.1: posts are post_status = publish
                //WP >= 2.1: post_type must be 'post', no date check required because future posts are post_status='future'
                if($wpCompat) $where.="(post_status = 'publish' OR post_status = 'future')";
                else $where.=" ((post_status = 'publish' OR post_status = 'future') AND (post_type = 'post' OR post_type = '')) ";
            }

Для WP < 2.1: может и не нужно ставить условие, но я думаю не повредит :)

Неактивен

 

#19 07.10.2010 11:25:28

W@D
Гуру-блогер
Зарегистрирован: 10.03.2008
Сообщений: 839

Re: Право читать "запланированные" посты.

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

Неактивен

 

Board footer

Работает на PunBB
© Копирайт 2002–2005 Rickard Andersson