[Помогите] Создать отдельную страницу комментариев для каждого пользователя

Тема в разделе "Wordpress", создана пользователем Teceract, 24 июл 2013.

Модераторы: Sorcus
  1. Teceract

    Teceract

    Регистр.:
    15 фев 2009
    Сообщения:
    165
    Симпатии:
    75
    Привет всем!

    Ну вроде как простецкая проблема, но оказалось, что не смог ее решить. Думаю многим тоже будет полезно узнать, как можно реализовать данный вывод.
    Проблема следующая:
    Нужно сделать вывод комментариев каждого отдельного пользователя на отдельной странице. Стандартный профиль пользователя выводится по такому адресу:
    сайт.ру/author/usertakoito
    а нужно сделать дополнительную страницу, но уже комментариев:
    сайт.ру/comments/usertakoito
    Конечно можно было ограничиться сделать вкладки: Профиль / Комментарии / Записи
    Но голова ищет проблем.

    Что я сделал:
    1. Сделал рабочий вывод комментариев (тестировал в файле профиля: author.php)
    2. Создал страницу со slug comments
    3. Сделал для этой страницы парсер "параметра":

    PHP:
    function add_my_var($public_query_vars) {
    $public_query_vars[] = 'author';
    return 
    $public_query_vars;
    }
     
    add_filter('query_vars''add_my_var');
     
    function 
    do_rewrite() {
    add_rewrite_rule('comments/([^/]+)/?$''index.php?pagename=comments&author=$matches[1]','top');
    }
     
    add_action('init''do_rewrite');
    В итоге путь работает, но не совсем верно. При вводе несуществующего пользователя по идее должна выходить ошибка 404, но ее нету.
    Да и не отображается мой шаблон вывода комментариев

    Помогите разобраться с данной проблемой.

    Заранее всем спасибо! =)
     
  2. xbreaker

    xbreaker Вверх ногами

    Регистр.:
    15 авг 2007
    Сообщения:
    245
    Симпатии:
    52
    Чтобы понять проблему нужно увидеть шаблон страницы комментариев целиком, где видно как вы обрабатываете переменную с ником автора и выводите комментарии.
     
  3. Teceract

    Teceract

    Регистр.:
    15 фев 2009
    Сообщения:
    165
    Симпатии:
    75
    вчера проверял, при запросе в адресной строке /comments выводятся все комментарии
    а при постановке пользователя, выходит 404


    PHP:
    <?php
    /* Template Name: Author Comments */
    get_header();
    ?>
    <section id="primary" class="site-content">
    <div id="content" role="main">
     
     
     
    <?php    // размещаем в файле function.php
    /*
    function add_my_var($public_query_vars) {
        $public_query_vars[] = 'author';
        return $public_query_vars;
    }
     
    add_filter('query_vars', 'add_my_var');
     
    function do_rewrite() {
        add_rewrite_rule('comments/([^/]+)/?$', 'index.php?pagename=comments&author=$matches[1]','top');
    }
     
    add_action('init', 'do_rewrite');
    */
    ?>
     
     
     
     
    <?php
    $wpdb
    ->get_var("SELECT FROM ".$wpdb->prefix ."comments WHERE comment_author = '$author'");
    ?>
     
     
     
     
    <?php // Функция вывода комментариев
    function author_comments(){
    global 
    $wpdb;
    $curauth = (get_query_var('author_name')) ? get_user_by('slug'get_query_var('author_name')) : get_userdata(get_query_var('author'));
    $com_author $curauth->ID;
    $inpage 5;                // сколько комментариев выводить
     
        
    if($_GET['page']) $page $_GET['page'];
            else 
    $page=1;
     
        
    $start = ($page-1)*$inpage;
     
        
    $count_comments $wpdb->get_var("SELECT COUNT(comment_ID) FROM ".$wpdb->prefix ."comments WHERE user_id = '$com_author'");
        
    $comments_user $wpdb->get_results("SELECT * FROM ".$wpdb->prefix ."comments WHERE comment_approved = '1' AND user_id = '$com_author' ORDER BY comment_date DESC LIMIT $start,$inpage");
        
    // comment_approved = '1' AND        выводим только одобренные комментарии
     
        
    $num_page ceil($count_comments/$inpage);
     
        if(
    $comments_user){
            
    $commentlist '<div id="commentlist">';
            
    $commentlist .= '<h3>Комментарии пользователя '.$curauth->nickname.':</h3>';
            foreach(
    $comments_user as $comment){
                
    $commentlist .= '<h2><a href="'.get_permalink$comment->comment_post_ID ).'" title="Перейти к записи">'.get_the_title($comment->comment_post_ID).'&rarr;</a></h2>';
                
    $commentlist .= '<div id="feed-comment-'.$comment->comment_post_ID.'">';
                
    $commentlist .= '<div class="feed-content-box">'.$comment->comment_content.'';
                
    $commentlist .= '<div class="feedcommentmeta"><a target="_blank" href="'.get_permalink$comment->comment_post_ID ).'#comment-'.$comment->comment_ID.'" title="Перейти к комментарию">'.mysql2date('d.m.Y в G:i'$comment->comment_date).'</a></div></div>';
                
    $commentlist .= '</div>';
            }
            
    $commentlist .= '</div>';
            echo 
    $commentlist;
            if(
    $inpage&&$count_comments>$inpage){
                
    $url get_author_posts_url($com_author);
                
    $url explode('?',$url);
                if(
    $url[1]){
                    
    $redirect_url get_author_posts_url($com_author).'&';
                } else {
                    
    $redirect_url get_author_posts_url($com_author).'?';
                }
                
    $page_navi .= '<div class="user-navi">';
                
    $next $page 3;
                
    $prev $page 4;
                if(
    $prev==1$page_navi .= '<a href="'.$redirect_url.'page=1">1</a>';
                for(
    $a=1;$a<=$num_page;$a++){
                if(
    $a==1&&$a<=$prev&&$prev!=1$page_navi .= '<a href="'.$redirect_url.'page=1">1</a> ... ';
                    if(
    $prev<$a&&$a<=$next){
                    if(
    $page==$a$page_navi .= '<span>'.$a.'</span>';
                        else 
    $page_navi .= '<a href="'.$redirect_url.'page='.$a.'">'.$a.'</a>';
                    }
                }
                if(
    $next<$num_page&&$num_page!=$next+1$page_navi .= ' ... <a href="'.$redirect_url.'page='.$num_page.'">'.$num_page.'</a>';
                if(
    $num_page==$next+1$page_navi .= '<a href="'.$redirect_url.'page='.$num_page.'">'.$num_page.'</a>';
                
    $page_navi .= '</div>';
            }
            echo 
    $page_navi;
    } else { 
    // Если у пользователя нет комментариев
        
    echo 'Пользователь не оставил комментариев.';
    }
    }
    ?>
     
    <?php echo author_comments(); ?>
     
     
     
    <?php
    echo get_query_var('author');
    ?>
     
    </div>
    </section>
     
    <style>
    #commentlist {padding: 15px 0px 0px 0px;}
    #commentlist h3 {border-bottom: 1px solid #dddddd; font-family: georgia; font-size: 16px; margin: 0px 0px 10px 0px; padding: 0px 0px 10px 0px;}
    .feed-content-box {border-bottom: 1px solid #dddddd; line-height: 16px; margin: 10px 0px 10px 0px; padding: 10px 10px 0px 5px;}
    .feedcommentmeta a {color: #ADADAD; font-size: 10px;}
    .user-navi a {color: #0657a5; display: inline; font-size: 11px; padding: 5px 9px 5px 9px; margin: 0px 2px 0px 2px;}
    </style>
     
    <?php get_sidebar(); ?>
    <?php get_footer
    (); ?>
     
  4. xbreaker

    xbreaker Вверх ногами

    Регистр.:
    15 авг 2007
    Сообщения:
    245
    Симпатии:
    52
    Непонятно зачем вам такой велосипед для комментариев, если есть функция get_comments:
    PHP:
    <?php get_comments$defaults = array(
    'author_email' => 'cool@boy.ru',
    'number' => '10',
    'order' => 'DESC',
    'post_status' => 'approve',
    'post_type' => 'post'
    ) ); ?>
    А ваша задача сводится к получению ID пользователя, его профиля и поиску комментариев по email, для чего все таки стоит отказаться от query_var = author, которое уже используется WP для передачи ID пользователя. Да еще и используете get_userdata, где нужно использовать его id, а не slug:
    PHP:
    <?php $user_info get_userdata(1);
    echo 
    'Username: ' $user_info->user_login "\n";
    echo 
    'User level: ' $user_info->user_level "\n";
    echo 
    'User ID: ' $user_info->ID "\n";
    ?>
    В общем вам нужно привести в порядок ваш код:


    Если все равно будет 404 ошибка, то проверьте попадает ли ваше правило в глобальный wp_rewrite.
     
    Teceract нравится это.
  5. Teceract

    Teceract

    Регистр.:
    15 фев 2009
    Сообщения:
    165
    Симпатии:
    75
    Да, действительно вышла ошибка 404, но теперь более понятно, в какую сторону копать. Скрипт делал на чистый вордпресс, скорей всего ошибка выходит на самом деле из-за неправильно указанного правила в глобальном wp_rewrite. Спасибо большое за помощь!
    Если получится разобраться до конца, опубликую готовый код.
     
  6. xbreaker

    xbreaker Вверх ногами

    Регистр.:
    15 авг 2007
    Сообщения:
    245
    Симпатии:
    52
    Чтобы быть уверенным в том, что правило попало в глобальный wp_rewrite, я бы рекомендовал использовать код такого вида:

    В функции myFlushRules мы проверяем наличие нашего правило в глобальном wp_rewrite и, если оно отсутствует, вызываем обновление списка правил. Таким образом, после добавления очередного правила, код условия проверки можно менять.
     
    Teceract нравится это.
  7. Teceract

    Teceract

    Регистр.:
    15 фев 2009
    Сообщения:
    165
    Симпатии:
    75
    В общем с помощью Вас я добился результата. Теперь действительно отображаются комментарии для каждого пользователя отдельно, но появилась снова другая проблема. Теперь не выходит ошибка 404, если ввести несуществующего пользователя.
    Можно ли как то сделать проверку?
     
  8. xbreaker

    xbreaker Вверх ногами

    Регистр.:
    15 авг 2007
    Сообщения:
    245
    Симпатии:
    52
    Всё правильно, ведь мы открываем страницу comments, а она у нас существует в любом случае, в то время как id пользователя всего лишь параметр данной страницы. Чтобы выдать ошибку 404 нам нужно обратиться к глобальному wp_query, обязательно в шаблоне header.php:

    Не стоит забывать, что данный код нужно поместить в условие, когда указанный автор не найден.
     
    Teceract нравится это.
  9. Teceract

    Teceract

    Регистр.:
    15 фев 2009
    Сообщения:
    165
    Симпатии:
    75
    много статей прочитал, но не видел такое перенаправление, да что там, даж не подумал.
    Как много способов всего достичь))))
    Немного помучался с header.php, но все же получилось.
    В принципе квест завершен)))) Спасибо что помогли мне и надеюсь, что другим тоже будет полезно =)
     
    xbreaker нравится это.