web-dev-qa-db-de.com

Müssen Sie umleiten, wenn die Suche mit dem aktuellen Titel eines Posts übereinstimmt

Ich benutze WordPress 3.3.1 und bin neu in diesem System. Ich möchte die Suchabfrage auf den Beitrag umleiten, wenn die Abfrage genau mit dem Beitragstitel eines Beitrags übereinstimmt. Ich möchte auch, dass es vor Suchanfragen und Hooks oder Filtern ausgeführt wird. Ich habe einige Änderungen in der query.php im include-Ordner vorgenommen

$search .= "{$searchand}(($wpdb->posts.post_title LIKE '{$n}{$term}{$n}'))";

und schrieb einige Plugin-Funktion wie folgt:

add_action('template_redirect', 'single_result');
function single_result() {
    if (is_search()) {
        global $wp_query;
        if ($wp_query->post_count == 1) {
            wp_redirect( get_permalink( $wp_query->posts['0']->ID ) );
        }
    }
}

Ich habe auch einige Funktionen, die direkt nach dieser Suchanfrage ausgeführt werden müssen und "get_header" -Hooks haben. Bisher stimmen die Übereinstimmungen und Weiterleitungen der Suchabfragen nicht überein und werden wie erwartet zurückgegeben. Es rutscht die meiste Zeit aus und leitet nicht perfekt um. Ich möchte, dass Suche und Weiterleitung perfekt sind. Jede Hilfe wird sehr geschätzt und dankbar sein. Vielen Dank.

3
Mauriya

Hacken Sie zunächst keine Kerndateien (es sei denn, Sie möchten einen Patch einreichen :)).

Zweitens überprüfen Sie nicht wirklich, ob der Titel genau mit der Suchzeichenfolge übereinstimmt. Was Sie tun, um zu überprüfen, ob es nur ein Ergebnis gibt. Das heißt nicht, dass der Titel passt. Machen Sie den Core-Hack rückgängig und machen Sie Folgendes:

function redir_title_match($a) {
  if (is_search()) {
    global $wp_query;
    $s_str = $wp_query->query_vars['s'];
    foreach ($wp_query->posts as $p) {
      if ($p->post_title == $s_str) {
        wp_safe_redirect(get_permalink($p->ID));
        exit();
      }
    }
  }
}
add_filter('template_redirect','redir_title_match');

Das ist case sensitive. Wenn Sie das nicht möchten, verwenden Sie strtolower , indem Sie diese Änderung in Zeile 6 vornehmen:

if ($p->post_title == $s_str) {
=>
if (strtolower($p->post_title) == strtolower($s_str)) {

Diese Abfrage wird auch nach der WordPress-Suche ausgeführt, die nicht mit der vom OP angeforderten übereinstimmt. Es ist jedoch erforderlich,aquery auszuführen, damit die Verwendung der Standardabfrage sinnvoll ist.

@Rarst merkt in den Kommentaren an, dass dies keine absolut zuverlässige Lösung ist. Ich glaube, dass das stimmt, obwohl ich nicht weiß, wie wichtig es in der Praxis ist. Hierbei handelt es sich jedoch um eine Option, die zuverlässig sein sollte, der Suchseite jedoch eine Abfrage hinzufügt.

function redir_rigid_title_match() {
  if (is_search()) {
    global $wp_query,$wpdb;
    $s_str = $wp_query->query_vars['s'];
    $m = $wpdb->get_var($wpdb->prepare("SELECT ID FROM {$wpdb->posts} WHERE post_title = %s",$s_str));
    if (!empty($m)) {
      wp_safe_redirect(get_permalink($m));
      exit();
    }
  }
}
add_filter('pre_get_posts','redir_rigid_title_match');

Wie oben ist dieszwischen Groß- und Kleinschreibung.


2
s_ha_dum