enexoonoma
  • 0
Новичок

Есть ли код лучше/быстрее этого? Он показывает категории, которые автор когда-либо размещал в

  • 0

У меня есть этот запрос, который показывает категории, в которых разместил пользователь. Например, если у меня есть 3 кошки, имя НОВОСТИ, СМИ, ПУБЛИКАЦИИ, а автор опубликовал только в первых двух, он покажет

НОВОСТИ

СМИ

Есть ли какой-нибудь код лучше этого или улучшение, потому что моя БД действительно огромна, и это дает мне дросселирование? Спасибо.

<?php
$author = get_query_var('author');
$categories = $wpdb->get_results("
SELECT DISTINCT(terms.term_id) as ID, terms.name
    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 posts.post_author = '{$post->post_author}' ");
?>

<ul>
    <?php foreach($categories as $category) : ?>
<?php if ( ($category->ID == '3')   || ($category->ID == '4')  || ($category->ID == '5')) { ?>
    <li>
        <a href="<?php echo get_category_link( $category->ID ); ?>/?author_name=<?php echo $curuser->user_login; ?>" title="<?php echo $category->name ?>">
            <?php echo $category->name; ?>
        </a>
    </li>
<?php } ?>
    <?php endforeach; ?>
</ul>
Share
  1. Ваш SQL не ограничивает соответствие терминов только категориям. Вы также получаете обратно теги и любую другую таксономию. Таким образом, возвращаемые данные могут быть больше, чем ожидалось.

    Таксономия является ключом в таблице term_taxonomy, поэтому удаление ненужных должно быть быстрым.

    SELECT DISTINCT(terms.term_id) as ID, terms.name
    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 AND tax.taxonomy = "category")
    LEFT JOIN $wpdb->terms as terms ON tax.term_id = terms.term_id
    WHERE posts.post_author = {$post->post_author}
    

    Может помочь. Ваш DISTINCT также, вероятно, вызывает использование временной таблицы для сортировки и тому подобного. Вместо этого вы можете попробовать использовать GROUP BY, например:

    SELECT terms.term_id AS ID, terms.name
    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
    AND tax.taxonomy =  "category" ) 
    LEFT JOIN $wpdb->terms AS terms ON tax.term_id = terms.term_id
    WHERE posts.post_author = {$post->post_author}
    AND terms.term_id IS NOT NULL 
    GROUP BY terms.term_id
    

    Может дать лучшие результаты. Настройте их оба, запустите их через phpMyAdmin и сделайте для них EXPLAIN, посмотрите, что дает лучшие результаты.

    Кроме того, post_author является целым числом. Вам не нужны кавычки вокруг него.

    • 0
  2. Я не большой эксперт по SQL, но это похоже на ресурсоемкую операцию, как бы вы к ней ни подходили.

    С другой стороны, это не похоже на очень динамичную информацию, поэтому я предлагаю просто кэшировать результаты с помощью Transients API для приличного интервала.

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

    • 0

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

You must login to add an answer.