Changed omitted related tags (like tagme) to be powered by a setting, allowing any performance-impacting (or just not useful in this context) tags to be omitted
Further tag list performance improvements TagListConfig constants
This commit is contained in:
parent
8606c70437
commit
88e6e68d79
@ -110,6 +110,7 @@ class Tag
|
|||||||
$term = str_replace('_', '\_', $term);
|
$term = str_replace('_', '\_', $term);
|
||||||
$term = str_replace('%', '\%', $term);
|
$term = str_replace('%', '\%', $term);
|
||||||
$term = str_replace('*', '%', $term);
|
$term = str_replace('*', '%', $term);
|
||||||
|
$term = str_replace("?", "_", $term);
|
||||||
return $term;
|
return $term;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -585,7 +585,7 @@ class OuroborosAPI extends Extension
|
|||||||
ORDER BY SCORE_STRNORM(substr(tag, 1, 1)) LIMIT :start, :max_items
|
ORDER BY SCORE_STRNORM(substr(tag, 1, 1)) LIMIT :start, :max_items
|
||||||
"
|
"
|
||||||
),
|
),
|
||||||
['tags_min' => $config->get_int('tags_min'), 'start' => $start, 'max_items' => $limit]
|
['tags_min' => $config->get_int(TagListConfig::TAGS_MIN), 'start' => $start, 'max_items' => $limit]
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 'count':
|
case 'count':
|
||||||
@ -596,7 +596,7 @@ class OuroborosAPI extends Extension
|
|||||||
WHERE count >= :tags_min
|
WHERE count >= :tags_min
|
||||||
ORDER BY count DESC, tag ASC LIMIT :start, :max_items
|
ORDER BY count DESC, tag ASC LIMIT :start, :max_items
|
||||||
",
|
",
|
||||||
['tags_min' => $config->get_int('tags_min'), 'start' => $start, 'max_items' => $limit]
|
['tags_min' => $config->get_int(TagListConfig::TAGS_MIN), 'start' => $start, 'max_items' => $limit]
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
case 'date':
|
case 'date':
|
||||||
@ -607,7 +607,7 @@ class OuroborosAPI extends Extension
|
|||||||
WHERE count >= :tags_min
|
WHERE count >= :tags_min
|
||||||
ORDER BY count DESC, tag ASC LIMIT :start, :max_items
|
ORDER BY count DESC, tag ASC LIMIT :start, :max_items
|
||||||
",
|
",
|
||||||
['tags_min' => $config->get_int('tags_min'), 'start' => $start, 'max_items' => $limit]
|
['tags_min' => $config->get_int(TagListConfig::TAGS_MIN), 'start' => $start, 'max_items' => $limit]
|
||||||
);
|
);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
31
ext/tag_list/config.php
Normal file
31
ext/tag_list/config.php
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
class TagListConfig
|
||||||
|
{
|
||||||
|
public const LENGTH = "tag_list_length";
|
||||||
|
public const POPULAR_TAG_LIST_LENGTH = "popular_tag_list_length";
|
||||||
|
public CONSt TAGS_MIN = "tags_min";
|
||||||
|
public const INFO_LINK = "info_link";
|
||||||
|
public const IMAGE_TYPE = "tag_list_image_type";
|
||||||
|
public const RELATED_SORT = "tag_list_related_sort";
|
||||||
|
public const POPULAR_SORT = "tag_list_popular_sort";
|
||||||
|
public const PAGES = "tag_list_pages";
|
||||||
|
public const OMIT_TAGS = "tag_list_omit_tags";
|
||||||
|
|
||||||
|
public const TYPE_RELATED = "related";
|
||||||
|
public const TYPE_TAGS= "tags";
|
||||||
|
|
||||||
|
public const TYPE_CHOICES = [
|
||||||
|
"Image's tags only" => TagListConfig::TYPE_TAGS,
|
||||||
|
"Show related" => TagListConfig::TYPE_RELATED
|
||||||
|
];
|
||||||
|
|
||||||
|
public const SORT_ALPHABETICAL = "alphabetical";
|
||||||
|
public const SORT_TAG_COUNT = "tagcount";
|
||||||
|
|
||||||
|
public const SORT_CHOICES = [
|
||||||
|
"Tag Count" => TagListConfig::SORT_TAG_COUNT,
|
||||||
|
"Alphabetical" => TagListConfig::SORT_ALPHABETICAL
|
||||||
|
];
|
||||||
|
}
|
@ -1,18 +1,21 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
require_once "config.php";
|
||||||
|
|
||||||
class TagList extends Extension
|
class TagList extends Extension
|
||||||
{
|
{
|
||||||
public function onInitExt(InitExtEvent $event)
|
public function onInitExt(InitExtEvent $event)
|
||||||
{
|
{
|
||||||
global $config;
|
global $config;
|
||||||
$config->set_default_int("tag_list_length", 15);
|
$config->set_default_int(TagListConfig::LENGTH, 15);
|
||||||
$config->set_default_int("popular_tag_list_length", 15);
|
$config->set_default_int(TagListConfig::POPULAR_TAG_LIST_LENGTH, 15);
|
||||||
$config->set_default_int("tags_min", 3);
|
$config->set_default_int(TagListConfig::TAGS_MIN, 3);
|
||||||
$config->set_default_string("info_link", 'http://en.wikipedia.org/wiki/$tag');
|
$config->set_default_string(TagListConfig::INFO_LINK, 'http://en.wikipedia.org/wiki/$tag');
|
||||||
$config->set_default_string("tag_list_image_type", 'related');
|
$config->set_default_string(TagListConfig::OMIT_TAGS, 'tagme*');
|
||||||
$config->set_default_string("tag_list_related_sort", 'alphabetical');
|
$config->set_default_string(TagListConfig::IMAGE_TYPE, TagListConfig::TYPE_RELATED);
|
||||||
$config->set_default_string("tag_list_popular_sort", 'tagcount');
|
$config->set_default_string(TagListConfig::RELATED_SORT, TagListConfig::SORT_ALPHABETICAL);
|
||||||
$config->set_default_bool("tag_list_pages", false);
|
$config->set_default_string(TagListConfig::POPULAR_SORT, TagListConfig::SORT_TAG_COUNT);
|
||||||
|
$config->set_default_bool(TagListConfig::PAGES, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function onPageRequest(PageRequestEvent $event)
|
public function onPageRequest(PageRequestEvent $event)
|
||||||
@ -78,7 +81,7 @@ class TagList extends Extension
|
|||||||
public function onPostListBuilding(PostListBuildingEvent $event)
|
public function onPostListBuilding(PostListBuildingEvent $event)
|
||||||
{
|
{
|
||||||
global $config, $page;
|
global $config, $page;
|
||||||
if ($config->get_int('tag_list_length') > 0) {
|
if ($config->get_int(TagListConfig::LENGTH) > 0) {
|
||||||
if (!empty($event->search_terms)) {
|
if (!empty($event->search_terms)) {
|
||||||
$this->add_refine_block($page, $event->search_terms);
|
$this->add_refine_block($page, $event->search_terms);
|
||||||
} else {
|
} else {
|
||||||
@ -105,8 +108,8 @@ class TagList extends Extension
|
|||||||
public function onDisplayingImage(DisplayingImageEvent $event)
|
public function onDisplayingImage(DisplayingImageEvent $event)
|
||||||
{
|
{
|
||||||
global $config, $page;
|
global $config, $page;
|
||||||
if ($config->get_int('tag_list_length') > 0) {
|
if ($config->get_int(TagListConfig::LENGTH) > 0) {
|
||||||
if ($config->get_string('tag_list_image_type') == 'related') {
|
if ($config->get_string(TagListConfig::IMAGE_TYPE) == TagListConfig::TYPE_RELATED) {
|
||||||
$this->add_related_block($page, $event->image);
|
$this->add_related_block($page, $event->image);
|
||||||
} else {
|
} else {
|
||||||
if (class_exists("TagCategories") and $config->get_bool(TagCategoriesConfig::SPLIT_ON_VIEW)) {
|
if (class_exists("TagCategories") and $config->get_bool(TagCategoriesConfig::SPLIT_ON_VIEW)) {
|
||||||
@ -121,30 +124,30 @@ class TagList extends Extension
|
|||||||
public function onSetupBuilding(SetupBuildingEvent $event)
|
public function onSetupBuilding(SetupBuildingEvent $event)
|
||||||
{
|
{
|
||||||
$sb = new SetupBlock("Tag Map Options");
|
$sb = new SetupBlock("Tag Map Options");
|
||||||
$sb->add_int_option("tags_min", "Only show tags used at least ");
|
$sb->add_int_option(TagListConfig::TAGS_MIN, "Only show tags used at least ");
|
||||||
$sb->add_label(" times");
|
$sb->add_label(" times");
|
||||||
$sb->add_bool_option("tag_list_pages", "<br>Paged tag lists: ");
|
$sb->add_bool_option(TagListConfig::PAGES, "<br>Paged tag lists: ");
|
||||||
$event->panel->add_block($sb);
|
$event->panel->add_block($sb);
|
||||||
|
|
||||||
$sb = new SetupBlock("Popular / Related Tag List");
|
$sb = new SetupBlock("Popular / Related Tag List");
|
||||||
$sb->add_int_option("tag_list_length", "Show top ");
|
$sb->add_int_option(TagListConfig::LENGTH, "Show top ");
|
||||||
$sb->add_label(" related tags");
|
$sb->add_label(" related tags");
|
||||||
$sb->add_int_option("popular_tag_list_length", "<br>Show top ");
|
$sb->add_int_option(TagListConfig::POPULAR_TAG_LIST_LENGTH, "<br>Show top ");
|
||||||
$sb->add_label(" popular tags");
|
$sb->add_label(" popular tags");
|
||||||
$sb->add_text_option("info_link", "<br>Tag info link: ");
|
$sb->start_table();
|
||||||
$sb->add_choice_option("tag_list_image_type", [
|
$sb->add_text_option(TagListConfig::INFO_LINK, "Tag info link", true);
|
||||||
"Image's tags only" => "tags",
|
$sb->add_text_option(TagListConfig::OMIT_TAGS, "Omit tags", true);
|
||||||
"Show related" => "related"
|
$sb->add_choice_option(TagListConfig::IMAGE_TYPE,
|
||||||
], "<br>Image tag list: ");
|
TagListConfig::TYPE_CHOICES,
|
||||||
$sb->add_choice_option("tag_list_related_sort", [
|
"Image tag list", true);
|
||||||
"Tag Count" => "tagcount",
|
$sb->add_choice_option(TagListConfig::RELATED_SORT,
|
||||||
"Alphabetical" => "alphabetical"
|
TagListConfig::SORT_CHOICES,
|
||||||
], "<br>Sort related list by: ");
|
"Sort related list by", true);
|
||||||
$sb->add_choice_option("tag_list_popular_sort", [
|
$sb->add_choice_option(TagListConfig::POPULAR_SORT,
|
||||||
"Tag Count" => "tagcount",
|
TagListConfig::SORT_CHOICES,
|
||||||
"Alphabetical" => "alphabetical"
|
"Sort popular list by", true);
|
||||||
], "<br>Sort popular list by: ");
|
$sb->add_bool_option("tag_list_numbers", "Show tag counts", true);
|
||||||
$sb->add_bool_option("tag_list_numbers", "<br>Show tag counts: ");
|
$sb->end_table();
|
||||||
$event->panel->add_block($sb);
|
$event->panel->add_block($sb);
|
||||||
}
|
}
|
||||||
// }}}
|
// }}}
|
||||||
@ -165,17 +168,56 @@ class TagList extends Extension
|
|||||||
return int_escape($_GET['mincount']);
|
return int_escape($_GET['mincount']);
|
||||||
} else {
|
} else {
|
||||||
global $config;
|
global $config;
|
||||||
return $config->get_int('tags_min'); // get the default.
|
return $config->get_int(TagListConfig::TAGS_MIN); // get the default.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static function get_omitted_tags(): array
|
||||||
|
{
|
||||||
|
global $config, $database;
|
||||||
|
$tags_config = $config->get_string(TagListConfig::OMIT_TAGS);
|
||||||
|
|
||||||
|
$results = $database->cache->get("tag_list_omitted_tags:".$tags_config);
|
||||||
|
|
||||||
|
if($results==null) {
|
||||||
|
$results = [];
|
||||||
|
$tags = explode(" ", $tags_config);
|
||||||
|
|
||||||
|
if (empty($tags)) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$where = [];
|
||||||
|
$args = [];
|
||||||
|
$i = 0;
|
||||||
|
foreach ($tags as $tag) {
|
||||||
|
$i++;
|
||||||
|
$arg = "tag$i";
|
||||||
|
$args[$arg] = Tag::sqlify($tag);
|
||||||
|
if (strpos($tag, '*') === false
|
||||||
|
&& strpos($tag, '?') === false) {
|
||||||
|
$where[] = " tag = :$arg ";
|
||||||
|
} else {
|
||||||
|
$where[] = " tag LIKE :$arg ";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
$results = $database->get_col("SELECT id FROM tags WHERE " . implode(" OR ", $where), $args);
|
||||||
|
|
||||||
|
$database->cache->set("tag_list_omitted_tags:" . $tags_config, $results, 600);
|
||||||
|
|
||||||
|
}
|
||||||
|
return $results;
|
||||||
|
}
|
||||||
|
|
||||||
private function get_starts_with(): string
|
private function get_starts_with(): string
|
||||||
{
|
{
|
||||||
global $config;
|
global $config;
|
||||||
if (isset($_GET['starts_with'])) {
|
if (isset($_GET['starts_with'])) {
|
||||||
return $_GET['starts_with'] . "%";
|
return $_GET['starts_with'] . "%";
|
||||||
} else {
|
} else {
|
||||||
if ($config->get_bool("tag_list_pages")) {
|
if ($config->get_bool(TagListConfig::PAGES)) {
|
||||||
return "a%";
|
return "a%";
|
||||||
} else {
|
} else {
|
||||||
return "%";
|
return "%";
|
||||||
@ -244,7 +286,7 @@ class TagList extends Extension
|
|||||||
"), ["tags_min"=>$tags_min, "tags_min2"=>$tags_min, "starts_with"=>$starts_with]);
|
"), ["tags_min"=>$tags_min, "tags_min2"=>$tags_min, "starts_with"=>$starts_with]);
|
||||||
|
|
||||||
$html = "";
|
$html = "";
|
||||||
if ($config->get_bool("tag_list_pages")) {
|
if ($config->get_bool(TagListConfig::PAGES)) {
|
||||||
$html .= $this->build_az();
|
$html .= $this->build_az();
|
||||||
}
|
}
|
||||||
foreach ($tag_data as $row) {
|
foreach ($tag_data as $row) {
|
||||||
@ -287,7 +329,7 @@ class TagList extends Extension
|
|||||||
"), ["tags_min"=>$tags_min, "starts_with"=>$starts_with]);
|
"), ["tags_min"=>$tags_min, "starts_with"=>$starts_with]);
|
||||||
|
|
||||||
$html = "";
|
$html = "";
|
||||||
if ($config->get_bool("tag_list_pages")) {
|
if ($config->get_bool(TagListConfig::PAGES)) {
|
||||||
$html .= $this->build_az();
|
$html .= $this->build_az();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -407,27 +449,34 @@ class TagList extends Extension
|
|||||||
}
|
}
|
||||||
// }}}
|
// }}}
|
||||||
// blocks {{{
|
// blocks {{{
|
||||||
private function add_related_block(Page $page, Image $image)
|
private function add_related_block(Page $page, Image $image): void
|
||||||
{
|
{
|
||||||
global $database, $config;
|
global $database, $config;
|
||||||
|
|
||||||
$query = "
|
$omitted_tags = self::get_omitted_tags();
|
||||||
SELECT t3.tag AS tag, t3.count AS calc_count, it3.tag_id
|
$starting_tags = $database->get_col("SELECT tag_id FROM image_tags WHERE image_id = :image_id",["image_id" => $image->id]);
|
||||||
FROM image_tags AS it1 -- Starting image's tags
|
|
||||||
INNER JOIN tags AS t1 ON t1.id = it1.tag_id AND t1.tag NOT LIKE 'tagme%'
|
$starting_tags = array_diff($starting_tags,$omitted_tags);
|
||||||
-- Get images with the same tags as the starting image
|
|
||||||
INNER JOIN image_tags AS it2 ON it1.tag_id=it2.tag_id
|
if(count($starting_tags) === 0) {
|
||||||
-- Get the tags from those other images except the same as the starting tags
|
// No valid starting tags, so can't look anything up
|
||||||
INNER JOIN image_tags AS it3 ON it2.image_id=it3.image_id
|
return;
|
||||||
LEFT JOIN image_tags it4 ON it4.image_id = it1.image_id AND it4.tag_id = it3.tag_id
|
}
|
||||||
INNER JOIN tags AS t3 ON t3.id = it3.tag_id AND t3.tag NOT LIKE 'tagme%'
|
|
||||||
WHERE
|
$query = "SELECT tags.* FROM tags INNER JOIN (
|
||||||
it1.image_id=:image_id
|
SELECT it2.tag_id
|
||||||
GROUP BY it3.tag_id, t3.tag, t3.count
|
FROM image_tags AS it1
|
||||||
ORDER BY calc_count DESC
|
INNER JOIN image_tags AS it2 ON it1.image_id=it2.image_id
|
||||||
|
AND it2.tag_id NOT IN (".implode(",",array_merge($omitted_tags,$starting_tags)).")
|
||||||
|
WHERE
|
||||||
|
it1.tag_id IN (".implode(",",$starting_tags).")
|
||||||
|
GROUP BY it2.tag_id
|
||||||
|
) A ON A.tag_id = tags.id
|
||||||
|
ORDER BY count DESC
|
||||||
LIMIT :tag_list_length
|
LIMIT :tag_list_length
|
||||||
";
|
";
|
||||||
$args = ["image_id" => $image->id, "tag_list_length" => $config->get_int('tag_list_length')];
|
|
||||||
|
$args = ["tag_list_length" => $config->get_int(TagListConfig::LENGTH)];
|
||||||
|
|
||||||
$tags = $database->get_all($query, $args);
|
$tags = $database->get_all($query, $args);
|
||||||
if (count($tags) > 0) {
|
if (count($tags) > 0) {
|
||||||
@ -440,11 +489,11 @@ class TagList extends Extension
|
|||||||
global $database;
|
global $database;
|
||||||
|
|
||||||
$query = "
|
$query = "
|
||||||
SELECT tags.tag, tags.count as calc_count
|
SELECT tags.tag, tags.count
|
||||||
FROM tags, image_tags
|
FROM tags, image_tags
|
||||||
WHERE tags.id = image_tags.tag_id
|
WHERE tags.id = image_tags.tag_id
|
||||||
AND image_tags.image_id = :image_id
|
AND image_tags.image_id = :image_id
|
||||||
ORDER BY calc_count DESC
|
ORDER BY tags.count DESC
|
||||||
";
|
";
|
||||||
$args = ["image_id"=>$image->id];
|
$args = ["image_id"=>$image->id];
|
||||||
|
|
||||||
@ -459,11 +508,11 @@ class TagList extends Extension
|
|||||||
global $database;
|
global $database;
|
||||||
|
|
||||||
$query = "
|
$query = "
|
||||||
SELECT tags.tag, tags.count as calc_count
|
SELECT tags.tag, tags.count
|
||||||
FROM tags, image_tags
|
FROM tags, image_tags
|
||||||
WHERE tags.id = image_tags.tag_id
|
WHERE tags.id = image_tags.tag_id
|
||||||
AND image_tags.image_id = :image_id
|
AND image_tags.image_id = :image_id
|
||||||
ORDER BY calc_count DESC
|
ORDER BY tags.count DESC
|
||||||
";
|
";
|
||||||
$args = ["image_id"=>$image->id];
|
$args = ["image_id"=>$image->id];
|
||||||
|
|
||||||
@ -479,16 +528,32 @@ class TagList extends Extension
|
|||||||
|
|
||||||
$tags = $database->cache->get("popular_tags");
|
$tags = $database->cache->get("popular_tags");
|
||||||
if (empty($tags)) {
|
if (empty($tags)) {
|
||||||
$query = "
|
$omitted_tags = self::get_omitted_tags();
|
||||||
SELECT tag, count as calc_count
|
|
||||||
FROM tags
|
if(empty($omitted_tags)) {
|
||||||
WHERE count > 0
|
$query = "
|
||||||
ORDER BY count DESC
|
SELECT tag, count
|
||||||
LIMIT :popular_tag_list_length
|
FROM tags
|
||||||
";
|
WHERE count > 0
|
||||||
$args = ["popular_tag_list_length"=>$config->get_int('popular_tag_list_length')];
|
ORDER BY count DESC
|
||||||
|
LIMIT :popular_tag_list_length
|
||||||
|
";
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$query = "
|
||||||
|
SELECT tag, count
|
||||||
|
FROM tags
|
||||||
|
WHERE count > 0
|
||||||
|
AND id NOT IN (".(implode(",", $omitted_tags)).")
|
||||||
|
ORDER BY count DESC
|
||||||
|
LIMIT :popular_tag_list_length
|
||||||
|
";
|
||||||
|
}
|
||||||
|
|
||||||
|
$args = ["popular_tag_list_length"=>$config->get_int(TagListConfig::POPULAR_TAG_LIST_LENGTH)];
|
||||||
|
|
||||||
$tags = $database->get_all($query, $args);
|
$tags = $database->get_all($query, $args);
|
||||||
|
|
||||||
$database->cache->set("popular_tags", $tags, 600);
|
$database->cache->set("popular_tags", $tags, 600);
|
||||||
}
|
}
|
||||||
if (count($tags) > 0) {
|
if (count($tags) > 0) {
|
||||||
@ -507,6 +572,20 @@ class TagList extends Extension
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$wild_tags = $search;
|
||||||
|
|
||||||
|
$related_tags = self::get_related_tags($search, $config->get_int(TagListConfig::LENGTH));
|
||||||
|
|
||||||
|
if (!empty($related_tags)) {
|
||||||
|
$this->theme->display_refine_block($page, $related_tags, $wild_tags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function get_related_tags(array $search, int $limit): array
|
||||||
|
{
|
||||||
|
global $config, $database;
|
||||||
|
|
||||||
|
|
||||||
$wild_tags = $search;
|
$wild_tags = $search;
|
||||||
$str_search = Tag::implode($search);
|
$str_search = Tag::implode($search);
|
||||||
$related_tags = $database->cache->get("related_tags:$str_search");
|
$related_tags = $database->cache->get("related_tags:$str_search");
|
||||||
@ -514,53 +593,66 @@ class TagList extends Extension
|
|||||||
if (empty($related_tags)) {
|
if (empty($related_tags)) {
|
||||||
// $search_tags = array();
|
// $search_tags = array();
|
||||||
|
|
||||||
$tag_id_array = [];
|
$starting_tags = [];
|
||||||
$tags_ok = true;
|
$tags_ok = true;
|
||||||
foreach ($wild_tags as $tag) {
|
foreach ($wild_tags as $tag) {
|
||||||
if ($tag[0] == "-" || strpos($tag, "tagme")===0) {
|
if ($tag[0] == "-") {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
$tag = str_replace("*", "%", $tag);
|
|
||||||
$tag = str_replace("?", "_", $tag);
|
$tag = Tag::sqlify($tag);
|
||||||
|
|
||||||
$tag_ids = $database->get_col("SELECT id FROM tags WHERE tag LIKE :tag AND count < 25000", ["tag" => $tag]);
|
$tag_ids = $database->get_col("SELECT id FROM tags WHERE tag LIKE :tag AND count < 25000", ["tag" => $tag]);
|
||||||
// $search_tags = array_merge($search_tags,
|
// $search_tags = array_merge($search_tags,
|
||||||
// $database->get_col("SELECT tag FROM tags WHERE tag LIKE :tag", array("tag"=>$tag)));
|
// $database->get_col("SELECT tag FROM tags WHERE tag LIKE :tag", array("tag"=>$tag)));
|
||||||
$tag_id_array = array_merge($tag_id_array, $tag_ids);
|
$starting_tags = array_merge($starting_tags, $tag_ids);
|
||||||
$tags_ok = count($tag_ids) > 0;
|
$tags_ok = count($tag_ids) > 0;
|
||||||
if (!$tags_ok) {
|
if (!$tags_ok) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$tag_id_list = join(', ', $tag_id_array);
|
|
||||||
|
|
||||||
if (count($tag_id_array) > 5 || count($tag_id_array) == 0) {
|
if (count($starting_tags) > 5 || count($starting_tags) === 0) {
|
||||||
return;
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$omitted_tags = self::get_omitted_tags();
|
||||||
|
|
||||||
|
$starting_tags = array_diff($starting_tags,$omitted_tags);
|
||||||
|
|
||||||
|
if(count($starting_tags) === 0) {
|
||||||
|
// No valid starting tags, so can't look anything up
|
||||||
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($tags_ok) {
|
if ($tags_ok) {
|
||||||
$query = "
|
$query = "SELECT t.tag, A.calc_count AS count FROM tags t INNER JOIN (
|
||||||
SELECT t2.tag AS tag, COUNT(it2.image_id) AS calc_count
|
SELECT it2.tag_id, COUNT(it2.image_id) AS calc_count
|
||||||
FROM image_tags AS it1 -- Got other images with the same tags
|
FROM image_tags AS it1 -- Got other images with the same tags
|
||||||
-- Get the tags from those images, except those the same as the starting tags
|
INNER JOIN image_tags AS it2 ON it1.image_id=it2.image_id
|
||||||
INNER JOIN image_tags AS it2 ON it1.image_id=it2.image_id AND it2.tag_id NOT IN($tag_id_list)
|
-- And filter out unwanted tags
|
||||||
-- And filter out anything starting with tagme
|
AND it2.tag_id NOT IN (".implode(",",array_merge($omitted_tags,$starting_tags)).")
|
||||||
INNER JOIN tags AS t2 ON it2.tag_id = t2.id AND t2.tag NOT LIKE 'tagme%'
|
|
||||||
WHERE
|
WHERE
|
||||||
it1.tag_id IN($tag_id_list)
|
it1.tag_id IN (".implode(",",$starting_tags).")
|
||||||
GROUP BY t2.tag
|
GROUP BY it2.tag_id) A ON A.tag_id = t.id
|
||||||
ORDER BY calc_count
|
ORDER BY A.calc_count
|
||||||
DESC LIMIT :limit
|
DESC LIMIT :limit
|
||||||
";
|
";
|
||||||
$args = ["limit"=>$config->get_int('tag_list_length')];
|
$args = ["limit" => $limit];
|
||||||
|
|
||||||
$related_tags = $database->get_all($query, $args);
|
$related_tags = $database->get_all($query, $args);
|
||||||
$database->cache->set("related_tags:$str_search", $related_tags, 60*60);
|
$database->cache->set("related_tags:$str_search", $related_tags, 60 * 60);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
if ($related_tags === false) {
|
||||||
|
return [];
|
||||||
|
} else {
|
||||||
|
return $related_tags;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!empty($related_tags)) {
|
|
||||||
$this->theme->display_refine_block($page, $related_tags, $wild_tags);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
}
|
}
|
||||||
|
@ -38,7 +38,7 @@ class TagListTheme extends Themelet
|
|||||||
{
|
{
|
||||||
global $config;
|
global $config;
|
||||||
|
|
||||||
$tag_info_link_is_visible = !is_null($config->get_string('info_link'));
|
$tag_info_link_is_visible = !is_null($config->get_string(TagListConfig::INFO_LINK));
|
||||||
$tag_count_is_visible = $config->get_bool("tag_list_numbers");
|
$tag_count_is_visible = $config->get_bool("tag_list_numbers");
|
||||||
|
|
||||||
return '
|
return '
|
||||||
@ -68,7 +68,7 @@ class TagListTheme extends Themelet
|
|||||||
{
|
{
|
||||||
global $config;
|
global $config;
|
||||||
|
|
||||||
if ($config->get_string('tag_list_related_sort') == 'alphabetical') {
|
if ($config->get_string(TagListConfig::RELATED_SORT) == TagListConfig::SORT_ALPHABETICAL) {
|
||||||
asort($tag_infos);
|
asort($tag_infos);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,12 +117,12 @@ class TagListTheme extends Themelet
|
|||||||
$page->add_block(new Block($category_display_name, $tag_categories_html[$category], "left", 9));
|
$page->add_block(new Block($category_display_name, $tag_categories_html[$category], "left", 9));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($config->get_string('tag_list_image_type')=="tags") {
|
if ($main_html != null) {
|
||||||
if ($main_html != null) {
|
if ($config->get_string(TagListConfig::IMAGE_TYPE)==TagListConfig::TYPE_TAGS) {
|
||||||
$page->add_block(new Block("Tags", $main_html, "left", 10));
|
$page->add_block(new Block("Tags", $main_html, "left", 10));
|
||||||
}
|
} else {
|
||||||
} else {
|
$page->add_block(new Block("Related Tags", $main_html, "left", 10));
|
||||||
$page->add_block(new Block("Related Tags", $main_html, "left", 10));
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -134,7 +134,7 @@ class TagListTheme extends Themelet
|
|||||||
*/
|
*/
|
||||||
private function get_tag_list_html($tag_infos, $sort)
|
private function get_tag_list_html($tag_infos, $sort)
|
||||||
{
|
{
|
||||||
if ($sort == 'alphabetical') {
|
if ($sort == TagListConfig::SORT_ALPHABETICAL) {
|
||||||
asort($tag_infos);
|
asort($tag_infos);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -170,10 +170,10 @@ class TagListTheme extends Themelet
|
|||||||
|
|
||||||
$main_html = $this->get_tag_list_html(
|
$main_html = $this->get_tag_list_html(
|
||||||
$tag_infos,
|
$tag_infos,
|
||||||
$config->get_string('tag_list_related_sort')
|
$config->get_string(TagListConfig::RELATED_SORT)
|
||||||
);
|
);
|
||||||
|
|
||||||
if ($config->get_string('tag_list_image_type')=="tags") {
|
if ($config->get_string(TagListConfig::IMAGE_TYPE)==TagListConfig::TYPE_TAGS) {
|
||||||
$page->add_block(new Block("Tags", $main_html, "left", 10));
|
$page->add_block(new Block("Tags", $main_html, "left", 10));
|
||||||
} else {
|
} else {
|
||||||
$page->add_block(new Block("Related Tags", $main_html, "left", 10));
|
$page->add_block(new Block("Related Tags", $main_html, "left", 10));
|
||||||
@ -193,7 +193,7 @@ class TagListTheme extends Themelet
|
|||||||
|
|
||||||
$main_html = $this->get_tag_list_html(
|
$main_html = $this->get_tag_list_html(
|
||||||
$tag_infos,
|
$tag_infos,
|
||||||
$config->get_string('tag_list_popular_sort')
|
$config->get_string(TagListConfig::POPULAR_SORT)
|
||||||
);
|
);
|
||||||
$main_html .= " <br><a class='more' href='".make_link("tags")."'>Full List</a>\n";
|
$main_html .= " <br><a class='more' href='".make_link("tags")."'>Full List</a>\n";
|
||||||
|
|
||||||
@ -213,7 +213,7 @@ class TagListTheme extends Themelet
|
|||||||
|
|
||||||
$main_html = $this->get_tag_list_html(
|
$main_html = $this->get_tag_list_html(
|
||||||
$tag_infos,
|
$tag_infos,
|
||||||
$config->get_string('tag_list_popular_sort')
|
$config->get_string(TagListConfig::POPULAR_SORT)
|
||||||
);
|
);
|
||||||
$main_html .= " <br><a class='more' href='".make_link("tags")."'>Full List</a>\n";
|
$main_html .= " <br><a class='more' href='".make_link("tags")."'>Full List</a>\n";
|
||||||
|
|
||||||
@ -242,10 +242,10 @@ class TagListTheme extends Themelet
|
|||||||
}
|
}
|
||||||
|
|
||||||
$h_tag_no_underscores = str_replace("_", " ", $h_tag);
|
$h_tag_no_underscores = str_replace("_", " ", $h_tag);
|
||||||
$count = $row['calc_count'];
|
$count = $row['count'];
|
||||||
// if($n++) $display_html .= "\n<br/>";
|
// if($n++) $display_html .= "\n<br/>";
|
||||||
if (!is_null($config->get_string('info_link'))) {
|
if (!is_null($config->get_string(TagListConfig::INFO_LINK))) {
|
||||||
$link = html_escape(str_replace('$tag', url_escape($tag), $config->get_string('info_link')));
|
$link = html_escape(str_replace('$tag', url_escape($tag), $config->get_string(TagListConfig::INFO_LINK)));
|
||||||
$display_html .= '<td class="tag_info_link_cell"> <a class="tag_info_link'.$tag_category_css.'" '.$tag_category_style.'href="'.$link.'">?</a></td>';
|
$display_html .= '<td class="tag_info_link_cell"> <a class="tag_info_link'.$tag_category_css.'" '.$tag_category_style.'href="'.$link.'">?</a></td>';
|
||||||
}
|
}
|
||||||
$link = $this->tag_link($row['tag']);
|
$link = $this->tag_link($row['tag']);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user