Support sorting posts in category

This commit is contained in:
Cooper Dalrymple
2025-11-18 18:08:51 -06:00
parent 43faa3df05
commit a0e7328726

View File

@@ -12,6 +12,7 @@ namespace Ogre\Sort;
use Ogre\Singleton;
use Ogre\Sort as Plugin;
use WP_Query;
if (!defined('ABSPATH')) exit;
@@ -26,9 +27,6 @@ final class Sort {
protected array $current_relationship = [];
protected function __construct() {
$this->relationships = [];
$this->current_relationship = [];
add_action('init', [$this, 'init'], 100);
}
@@ -40,7 +38,7 @@ final class Sort {
return true;
}
public function get_relationship_type(array $relationship):bool {
public function get_relationship_type(array $relationship):string {
if (isset($relationship['post_type']) && isset($relationship['taxonomy'])) {
return 'term';
} else if (isset($relationship['post_type']) && !isset($relationship['taxonomy'])) {
@@ -48,7 +46,7 @@ final class Sort {
} else if (!isset($relationship['post_type']) && isset($relationship['taxonomy'])) {
return 'taxonomy';
} else {
return false;
return '';
}
}
@@ -114,7 +112,7 @@ final class Sort {
foreach ($this->relationships as $relationship) {
switch ($relationship['type']) {
case 'term':
if ($screen->base == 'edit' && $screen->post_type == $relationship['post_type'] && (isset($_GET[$relationship['taxonomy']]) || (isset($_GET['taxonomy']) && $_GET['taxonomy'] == $relationship['taxonomy']))) {
if ($screen->base == 'edit' && $screen->post_type == $relationship['post_type'] && (isset($_GET[$relationship['taxonomy']]) || ($relationship['taxonomy'] === 'category' && isset($_GET['category_name'])) || (isset($_GET['taxonomy']) && $_GET['taxonomy'] == $relationship['taxonomy']))) {
$this->current_relationship = $relationship;
break;
}
@@ -140,9 +138,9 @@ final class Sort {
}
break;
}
if ($this->current_relationship != false) break;
if (!empty($this->current_relationship)) break;
}
if ($this->current_relationship == false) return;
if (empty($this->current_relationship)) return;
// Ajax
add_action('admin_enqueue_scripts', [$this, 'enqueue_scripts']);
@@ -162,7 +160,7 @@ final class Sort {
wp_enqueue_script('ogre-sort', Plugin::get_url('assets/sort.js'), ['jquery'], Plugin::get_version(), true);
wp_localize_script('ogre-sort', 'ogre_sort', $vars);
wp_enqueue_style('ogre-sort', Plugin::get_url('assets/sort/css'), false, Plugin::get_version());
wp_enqueue_style('ogre-sort', Plugin::get_url('assets/sort.css'), false, Plugin::get_version());
}
// Add Meta when Post is Updated
@@ -221,10 +219,10 @@ final class Sort {
// Query Filters
public function pre_get_posts($wp_query) {
if (empty($this->relationships)) return false;
if (isset($wp_query->query['orderby']) && !empty($wp_query->query['orderby']) && ((is_admin() && isset($_GET['orderby'])) || $wp_query->query['orderby'] != 'date')) return false;
//if (!is_admin() && isset($wp_query->query['suppress_filters'])) return false; // NOTE: suppress_filters set to true by default in get_posts
public function pre_get_posts(WP_Query $wp_query):void {
if (empty($this->relationships)) return;
if (isset($wp_query->query['orderby']) && !empty($wp_query->query['orderby']) && ((is_admin() && isset($_GET['orderby'])) || $wp_query->query['orderby'] != 'date')) return;
//if (!is_admin() && isset($wp_query->query['suppress_filters'])) return; // NOTE: suppress_filters set to true by default in get_posts
//if (!isset($wp_query->query['post_type'])) $wp_query->set('post_type', 'post');
$relationships = [];
@@ -236,22 +234,24 @@ final class Sort {
}
break;
case 'term':
if (isset($relationship['taxonomy']) && isset($wp_query->query[$relationship['taxonomy']])) {
if (isset($wp_query->query[$relationship['taxonomy']])) {
$relationships[] = $relationship;
} else if (isset($relationship['taxonomy']) && isset($wp_query->query['taxonomy']) && $wp_query->query['taxonomy'] == $relationship['taxonomy']) {
} else if (isset($wp_query->query['taxonomy']) && $wp_query->query['taxonomy'] == $relationship['taxonomy']) {
$relationships[] = $relationship;
} else if (isset($relationship['taxonomy']) && isset($wp_query->query['tax_query']) && is_array($wp_query->query['tax_query']) && !empty($wp_query->query['tax_query'])) {
} else if (isset($wp_query->query['tax_query']) && is_array($wp_query->query['tax_query']) && !empty($wp_query->query['tax_query'])) {
foreach ($wp_query->query['tax_query'] as $tax) {
if (!isset($tax['taxonomy'])) continue;
if ($relationship['taxonomy'] != $tax['taxonomy']) continue;
$relationships[] = $relationship;
break;
}
} else if ($relationship['taxonomy'] === 'category' && isset($wp_query->query['category_name'])) {
$relationships[] = $relationship;
}
break;
}
}
if (empty($relationships)) return false;
if (empty($relationships)) return;
$current_relationship = $relationships[0];
foreach ($relationships as $relationship) {
@@ -262,7 +262,7 @@ final class Sort {
}
}
if (empty($current_relationship)) $current_relationship = $relationships[0];
if (empty($current_relationship)) return false;
if (empty($current_relationship)) return;
switch ($current_relationship['type']) {
case 'term':
@@ -280,6 +280,8 @@ final class Sort {
$term_id = $tax['terms'];
break;
}
} else if ($current_relationship['taxonomy'] === 'category' && isset($wp_query->query['category_name'])) {
$term_id = $wp_query->query['category_name'];
}
if (empty($term_id)) break;
@@ -469,14 +471,7 @@ final class Sort {
exit;
}
$exists = false;
foreach ($this->relationships as $rel) {
if (($relationship['type'] == $rel['type']) && (!isset($relationship['post_type']) || $relationship['post_type'] == $rel['post_type']) && (!isset($relationship['taxonomy']) || $relationship['taxonomy'] == $rel['taxonomy'])) {
$exists = true;
break;
}
}
if ($exists == false) {
if (empty(array_filter($this->relationships, fn (array $item):bool => empty(array_diff($item, $relationship))))) {
wp_send_json_error(__('Relationship does not exist.', 'ogrecore'));
exit;
}