web-dev-qa-db-de.com

Warum erzeugt `get_permalink ()` ein Add. DB Anfrage ohne $ post-> Filter?

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.

5
kaiser

Mein Workaround für dieses Problem:

unset( $post->filter );

$url = get_permalink( $post );
4
scribu