Ich arbeite derzeit an einer benutzerdefinierten Schleife/Abfrage, bei der ich den Permalink eines Posts zu dem Array von Posts hinzufügen muss, die ich aus der Datenbank abrufe.
Leider erzeugt get_permalink()
für jeden Aufruf eine zusätzliche DB-Anfrage, die sehr intensiv werden kann, wenn ich all Posts auf einer Seite aufführe.
Ich dachte zuerst, es könnte sein, dass Aufrufe von get_option( 'permalink_structure' );
oder get_option( 'default_category' );
keine automatisch geladenen Optionen sind, aber beide sind automatisch geladen. Beweis hier:
function wpse_list_autoloaded_opts()
{
$results = $wpdb->get_results( "
SELECT option_name, option_value
FROM $wpdb->options
WHERE autoload = 'yes'
" );
echo '<pre>';
foreach( $results as $result )
if ( 'permalink_structure' === $result->option_name OR 'default_category' === $result->option_name )
echo "Name: {$result->option_name}, Value: {$result->option_value}<br />";
echo '<pre>';
}
add_action( 'shutdown', 'wpse_list_autoloaded_opts' );
EDIT: Ok, ich habe es geschafft, es in den folgenden Zeilen innerhalb der Funktion get_permalink()
aufzuspüren.
if ( is_object($id) && isset($id->filter) && 'sample' == $id->filter ) {
$post = $id;
$sample = true;
} else {
$post = &get_post($id);
$sample = false;
}
Also mein Q ist jetzt: Wie würde ich vermeiden, den Teil else
auszuführen, der get_post()
aufruft und die zusätzliche Abfrage ausführt?
EDIT 2: Jetzt wurde festgestellt, dass der docBlock von get_permalink()
genauso falsch ist wie der Codex . Sie können auch das gesamte $post
-Objekt an die Funktion übergeben. Dies löst den Teil if ( is_object($id)
.
Noch offen: Von wo zum Teufel würde ich $post->filter
mit einem Wert von 'sample'
abrufen?
EDIT 3: Das Hinzufügen von $post->filter = 'sample'
zu jedem Beitragsobjekt löst das Problem. Aber was bleibt, ist ein schlechtes Gefühl, dass ich etwas kaputt machen könnte. Der 'sample'
in $id/$post->filter
scheint ziemlich seltsam zu sein und ich kann nicht herausfinden, woher er kommt.
Mein Workaround für dieses Problem:
unset( $post->filter );
$url = get_permalink( $post );