feat(wpmc S3): Helpers::get_term_by_slug with per-request cache
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -15,4 +15,14 @@ final class Helpers
|
|||||||
self::$current_town_resolved = false;
|
self::$current_town_resolved = false;
|
||||||
self::$term_cache = [];
|
self::$term_cache = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function get_term_by_slug(string $slug, string $taxonomy = 'town'): ?\WP_Term
|
||||||
|
{
|
||||||
|
$key = $taxonomy . '|' . $slug;
|
||||||
|
if (array_key_exists($key, self::$term_cache)) {
|
||||||
|
return self::$term_cache[$key];
|
||||||
|
}
|
||||||
|
$term = \get_term_by('slug', $slug, $taxonomy);
|
||||||
|
return self::$term_cache[$key] = ($term instanceof \WP_Term) ? $term : null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
<?php
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace WPMultiCity\Tests;
|
||||||
|
|
||||||
|
use WPMultiCity\Helpers;
|
||||||
|
|
||||||
|
final class HelpersTest extends TestCase
|
||||||
|
{
|
||||||
|
public function test_get_term_by_slug_returns_wp_term_when_found(): void
|
||||||
|
{
|
||||||
|
$term = new \WP_Term();
|
||||||
|
$term->term_id = 42;
|
||||||
|
$term->slug = 'tyumen';
|
||||||
|
$term->taxonomy = 'town';
|
||||||
|
|
||||||
|
\Brain\Monkey\Functions\expect('get_term_by')
|
||||||
|
->once()
|
||||||
|
->with('slug', 'tyumen', 'town')
|
||||||
|
->andReturn($term);
|
||||||
|
|
||||||
|
$result = Helpers::get_term_by_slug('tyumen');
|
||||||
|
|
||||||
|
self::assertInstanceOf(\WP_Term::class, $result);
|
||||||
|
self::assertSame(42, $result->term_id);
|
||||||
|
self::assertSame('tyumen', $result->slug);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_get_term_by_slug_returns_null_when_not_found(): void
|
||||||
|
{
|
||||||
|
\Brain\Monkey\Functions\expect('get_term_by')
|
||||||
|
->once()
|
||||||
|
->with('slug', 'nonexistent', 'town')
|
||||||
|
->andReturn(false);
|
||||||
|
|
||||||
|
self::assertNull(Helpers::get_term_by_slug('nonexistent'));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function test_get_term_by_slug_caches_results_within_request(): void
|
||||||
|
{
|
||||||
|
\Brain\Monkey\Functions\expect('get_term_by')
|
||||||
|
->once()
|
||||||
|
->with('slug', 'tyumen', 'town')
|
||||||
|
->andReturn(false);
|
||||||
|
|
||||||
|
Helpers::get_term_by_slug('tyumen');
|
||||||
|
Helpers::get_term_by_slug('tyumen');
|
||||||
|
Helpers::get_term_by_slug('tyumen');
|
||||||
|
|
||||||
|
// Mockery ->once() at teardown verifies the cache stopped repeated calls.
|
||||||
|
self::assertTrue(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -9,3 +9,7 @@ if (!defined('ABSPATH')) {
|
|||||||
|
|
||||||
require_once __DIR__ . '/../includes/class-plugin.php';
|
require_once __DIR__ . '/../includes/class-plugin.php';
|
||||||
\WPMultiCity\Plugin::register_autoloader();
|
\WPMultiCity\Plugin::register_autoloader();
|
||||||
|
|
||||||
|
if (!class_exists('WP_Term', false)) {
|
||||||
|
eval('class WP_Term { public int $term_id = 0; public string $slug = ""; public string $taxonomy = ""; }');
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user