handiworknyccom
  • 0
Новичок

Список категорий для автора: функция list_categories внутри функции list_authors

  • 0

Я пытаюсь создать страницу «авторов», где есть список авторов и категорий, в которых они разместили.

Я могу использовать этот код, чтобы сделать это для одного автора на одной странице сообщения:

    <?php
    $cat_array = array();
    $args=array(
     'author' => get_the_author_meta('id'),
     'showposts'=>-1,
     'caller_get_posts'=>1
    );
    $author_posts = get_posts($args);
    if( $author_posts ) {
      foreach ($author_posts as $author_post ) {
        foreach(get_the_category($author_post->ID) as $category) {
          $cat_array[$category->term_id] =  $category->term_id;
        }
      }
    }

    $cat_ids = implode(',', $cat_array);
    $output = strtr( wp_list_categories( 'include='.$cat_ids.'&title_li=&style=none&echo=0' ), array( '<br />' => ' / ' ) );
    echo preg_replace( '@\s/\s\n$@', '', $output );
    ?>

Но когда я пытаюсь подключить этот бит к моей функции авторов списка (чтобы у каждого автора в списке отображались соответствующие категории), список категорий отображается вверху страницы (а не в div, где я помещаю код) и в div, где он должен отображаться, просто написано «массив». Я думаю, что это вопрос синтаксиса, так как я новичок в PHP.

Вот функция списка авторов:

//My List Authors Function
function my_list_authors($args = '') {
    global $wpdb;
    global $wp_query;
$author = get_query_var('author');
function authorCats() {
$categories = $wpdb->get_results("
    SELECT DISTINCT(terms.term_id) as ID, terms.name, terms.slug, tax.description
    FROM $wpdb->posts as posts
    LEFT JOIN $wpdb->term_relationships as relationships ON posts.ID = relationships.object_ID
    LEFT JOIN $wpdb->term_taxonomy as tax ON relationships.term_taxonomy_id = tax.term_taxonomy_id
    LEFT JOIN $wpdb->terms as terms ON tax.term_id = terms.term_id
    WHERE 1=1 AND (
        posts.post_status = 'publish' AND
        posts.post_author = '$author' AND
        tax.taxonomy = 'category' )
    ORDER BY terms.name ASC
");
foreach($categories as $category) :
echo '<li>
        <a href="'.get_category_link( $category->ID ).'" title="'.$category->name.'">
            '.$category->name.'
        </a>
    </li>';
endforeach;
}
    $defaults = array(
        'optioncount' => false, 'exclude_admin' => true,
        'show_fullname' => false, 'hide_empty' => true,
        'feed' => '', 'feed_image' => '', 'feed_type' => '', 'echo' => true,
        'style' => 'list', 'html' => true
    );

    $r = wp_parse_args( $args, $defaults );
    extract($r, EXTR_SKIP);
    $return = '';

    /** @todo Move select to get_authors(). */
    $users = get_users_of_blog();
    $author_ids = array();
    foreach ( (array) $users as $user )
        $author_ids[] = $user->user_id;
    if ( count($author_ids) > 0  ) {
        $author_ids = implode(',', $author_ids );
        $authors = $wpdb->get_results( "SELECT ID, user_nicename from $wpdb->users WHERE ID IN($author_ids) " . ($exclude_admin ? "AND user_login <> 'admin' " : '') . "ORDER BY display_name" );
    } else {
        $authors = array();
    }

    $author_count = array();
    foreach ( (array) $wpdb->get_results("SELECT DISTINCT post_author, COUNT(ID) AS count FROM $wpdb->posts WHERE post_type = 'post' AND " . get_private_posts_cap_sql( 'post' ) . " GROUP BY post_author") as $row )
        $author_count[$row->post_author] = $row->count;

    foreach ( (array) $authors as $author ) {

        $link = '';

        $author = get_userdata( $author->ID );
        $posts = (isset($author_count[$author->ID])) ? $author_count[$author->ID] : 0;
        $name = $author->display_name;

        if ( $show_fullname && ($author->first_name != '' && $author->last_name != '') )
            $name = "$author->first_name $author->last_name";

        if( !$html ) {
            if ( $posts == 0 ) {
                if ( ! $hide_empty )
                    $return .= $name . ', ';
            } else
                $return .= $name . ', ';

            // No need to go further to process HTML.
            continue;
        }

        $authorAvatar = get_avatar($author->ID);

        if ( !($posts == 0 && $hide_empty) && 'list' == $style )
            $return .= '
            <div class="authorBox">
                '.$authorAvatar.'
                <table>
                    <tr>
                        <td class="authorLabel">Founder & Editor:</td>
                        <td class="authorData"><a href="#">'.$author->nickname.'</a></td>
                    </tr>

                    <tr>
                        <td class="authorLabel">Location:</td>
                        <td class="authorData">'. $author->location .'</td>
                    </tr>

                    <tr>
                        <td class="authorLabel">Industry:</td>
                        <td class="authorData">Advertising</td>
                    </tr>';
            if ( $author->twitter != '' ) {
            $return .= 
                    '
                    <tr>
                        <td class="authorLabel">Website:</td>
                        <td class="authorData"><a href="#">'.$author->user_url.'</a></td>
                    </tr>

                    <tr class="last">
                        <td class="authorLabel">Twitter:</td>
                        <td class="authorData"><a href="#">'.$author->twitter.'</a></td>
                    </tr>';
            } else {
            $return .= '
                    <tr class="last">
                        <td class="authorLabel">Website:</td>
                        <td class="authorData"><a href="#">'.$author->user_url.'</a></td>
                    </tr>';
            }
            $return .= '
                </table>

                <div class="bioBox">
                    <ul>
                        <li class="bioTab"><a>Bio</a> <span></span></li>
                        <li class="thinkingTab"><a>Thinking About</a> <span></span></li>
                        <li><a>Articles</a> <span></span></li>  
                        <li><a>Reactions</a> <span></span></li>
                    </ul>
                </div>
                        <div class="authorBio tab"> 
                            <p class="center">'
                            .$author->description.  
                            '</p>
                        </div>

                        <div class="authorThink tab"> 
                            <p class="center">';
            $return .= 
$cat_array = array();
$args=array(
 'author' => get_the_author_meta('id'),
 'showposts'=>-1,
 'caller_get_posts'=>1
);
$author_posts = get_posts($args);
if( $author_posts ) {
  foreach ($author_posts as $author_post ) {
    foreach(get_the_category($author_post->ID) as $category) {
      $cat_array[$category->term_id] =  $category->term_id;
    }
  }
}

$cat_ids = implode(',', $cat_array);
$output = strtr( wp_list_categories( 'include='.$cat_ids.'&title_li=&style=none&echo=0' ), array( '<br />' => ' / ' ) );
echo preg_replace( '@\s/\s\n$@', '', $output );
            $return .=          '</p>
                        </div>
            </div>';
    }

    $return = trim($return, ', ');

    if ( ! $echo )
        return $return;
    echo $return;
}

Любое понимание или идеи высоко ценятся, спасибо!

Share
  1. Выглядело интересно, так что вот моя версия. Не уверен насчет get_user_by(), должен быть более надежный способ получить объекты для авторов.

    function my_list_authors() {
    
        $authors = wp_list_authors( array(
        'exclude_admin' => false,
        'html' => false,
        'echo' => false
        ) );
    
        $authors = explode( ',', $authors );
    
        echo '<ul>';
    
        foreach ( $authors as $author ) {
    
        $author = get_user_by( 'login', $author );
        $link = get_author_link( false, $author->ID );
        echo "<li><a href='{$link}'>{$author->display_name}</a><ul>";
    
        $posts = get_posts( array(
            'author' => $author->ID,
            'numberposts' => -1
        ) );
    
        $categories = array();
    
        foreach ( $posts as $post )
            foreach( get_the_category( $post->ID ) as $category )
            $categories[$category->term_id] =  $category->term_id;
    
        $output = wp_list_categories( array(
            'include' => $categories,
            'title_li' => '',
            'echo' => false
            ) );
    
        echo $output . '</ul></li>';
        }
    
        echo '</ul>';
    }
    
    • 0
    • Насколько я понимаю, сообщество существует для того, чтобы связывать людей с людьми, а не людей со статическими страницами кодекса/руководства. Чтение этого руководства не делает и четверти того, что сделало бы хорошо продуманное объяснение от опытного PHP-разработчика, поэтому я задал вопрос здесь. Я бы не задавал здесь этот вопрос, если бы уже не потратил часы за часами, пытаясь найти первопричину самостоятельно — часть учебного процесса. Спасибо.

      • 0
    • Я знаю, что учиться тяжело. — Если где-то в вашем выводе написано «array()», вы где-то печатаете/отображаете всю переменную массива. Найдите это место, потому что это не то, чем вы хотите заниматься. — Если он выводит материал до того места, куда вы хотите его вывести, убедитесь, что все выражения, которые вы используете, ничего не выводят. Например, найдите выражение, которое выводит что-то (может быть, тег шаблона wp?) и замените его чем-то, что не делает никакого вывода.

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

      • 0
    • PS Узнайте, что такое функция и как ее написать. Похоже, вы определили функцию внутри функции, что возможно в PHP, но в вашем случае это может быть признаком того, что вы что-то полностью перепутали. Слишком много использования копирования и вставки?

      • 0
  2. Вы пытаетесь отладить свой PHP-скрипт здесь через сообщество. Лучшее, что вы можете сделать с проблемами PHP, — это самостоятельно найти первопричину, чтобы изучить PHP. Обучение – это процесс совершения ошибок и последующего понимания того, как предотвратить их в будущем. Это то, что вы можете сделать только сами, сообщество ничего не может сделать вместо вас.

    Например, чтобы узнать больше о массивах, посетите документацию по PHP: Массивы.

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

    • 0

Оставить ответ

You must login to add an answer.