Eine ID von einer URL erhalten, warum kann WP dies selbst tun, aber keine der bereitgestellten functionen macht es richtig?

Ich habe eine Reihe von absoluten URLs, die verwendet wurden, um auf meine Website zu verweisen (sie stammen von Umleitungen in einer alten .htaccess-Datei in diesem Fall). Alle diese URLs führen zu einer bestimmten Seite oder einem Post auf der Website. Mit anderen Worten, wenn ich sie in meinem Browser verwende, funktionieren sie.

Viele davon werden von WordPress intern an aktuelle Formen des Permalinks dieses Posts weitergeleitet. Eine URL, die als /my-old-category/my-post-slug aufgezeichnet wurde, könnte sich stattdessen in /my-new-category/my-post-slug . WordPress hat kein Problem damit, diese Änderungen in der Praxis zu bewältigen. Ich lande nicht auf 404, wenn ich die alten URLs verwende.

Wenn ich jedoch programmgesteuert versuche, die ID der Zielseiten und Posts zu ermitteln, funktioniert WordPress nicht so gut. In diesem Fall, aus einer Liste von ein paar tausend URLs, habe ich ein paar hundert Fehler. Weder url_to_postid noch get_page_by_path scheinen konsistent zu funktionieren. Hier ist der Code, mit dem ich das beste Glück hatte, aber es lässt mich immer noch ein paar hundert Lookups kurz.

 foreach ( $array_of_urls as $url ) { $id = url_to_postid( $url ); if ( $id == 0 ) { $base = basename( untrailingslashit( $url ) ); $post = get_page_by_path( $base , OBJECT, 'page' ); if ( $post ) { $id = $post->ID; } else { $post = get_page_by_path( $base , OBJECT, 'post' ); if ( $post ) { $id = $post->ID; } } } echo "$id\t$url\n"; } 

Gibt es einen besseren Weg, dies zu tun? Wie gesagt, wenn ich diese alten URLs auf der Website benutze, kann WordPress die passende Seite oder Post finden. Warum kann ich die ID für diese Seiten und Beiträge nicht in PHP bereitstellen?

[Übrigens, ja, ich weiß, dass es auf StackExchange eine Reihe anderer Beiträge gibt, die Aspekte dieses Problems behandeln. Aber keiner scheint mir das auf den Grund zu gehen. Es tut mir leid, alten Boden neu zu bearbeiten.]

Aktualisieren

Basierend auf der Anleitung von @Milo unten schrieb ich den Code mit Bits von redirect_guess_404_permalink um und hatte eine viel bessere Lookup-Rate.

 foreach ( $array_of_urls as $url ) { $where = $wpdb->prepare("post_name LIKE %s", $wpdb->esc_like( basename( untrailingslashit( $url ) ) ) . '%'); $id = $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE $where AND post_status = 'publish'"); echo "$id\t$url\n"; } 

Kann jemand das verbessern?

Solutions Collecting From Web of "Eine ID von einer URL erhalten, warum kann WP dies selbst tun, aber keine der bereitgestellten functionen macht es richtig?"

Es mag so aussehen, als ob WordPress alte URLs intelligent umleitet, aber was es tut, ist nur zu raten und es meistens richtig zu machen, da die Art der Beiträge und URL-Struktur einzigartig genug ist, um richtig zu raten. Es gibt Fälle, in denen diese Schätzung falsch ist.

Sie können sehen, wo es das in WordPress-Quelle tut, die function wird passend redirect_guess_404_permalink .

API-functionen raten nicht, es ist entweder eine exakte Übereinstimmung oder nicht. Wenn Sie darüber nachdenken, macht es Sinn. Sie könnten diese functionalität duplizieren und die gleiche LIKE Abfrage für post_name wenn Sie versuchen möchten, eine mögliche Übereinstimmung auf dieselbe Weise wie WordPress zu finden.