web-dev-qa-db-fra.com

Pourquoi `get_permalink ()` produit-il un ajout? Demande de base de données sans $ post-> filter?

Je travaille actuellement sur une requête/boucle personnalisée pour laquelle je dois ajouter le lien permanent d'une publication à l'ensemble des publications que je récupère de la base de données.

Malheureusement, get_permalink() génère une demande de base de données supplémentaire pour chaque appel, ce qui peut devenir assez intense lorsque je liste tous les messages sur une seule page.

J'ai d'abord pensé aux appels à get_option( 'permalink_structure' ); ou à get_option( 'default_category' ); n'est pas une option chargée automatiquement, mais les deux sont chargés automatiquement. Preuve ici:

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, j'ai réussi à le localiser dans les lignes suivantes dans la fonction get_permalink().

if ( is_object($id) && isset($id->filter) && 'sample' == $id->filter ) {
        $post = $id;
        $sample = true;
    } else {
        $post = &get_post($id);
        $sample = false;
    }

Donc, mon Q est maintenant: Comment éviter d'exécuter la partie else qui appelle get_post() et effectue la requête supplémentaire?


EDIT 2: Maintenant découvert que le docBlock de get_permalink() est aussi faux que le Codex . Vous pouvez également transmettre l'intégralité de l'objet $post à la fonction. Cela résout la partie if ( is_object($id).

Toujours ouvert: D'où pourrais-je récupérer $post->filter avec une valeur de 'sample'?


EDIT 3: L'ajout de $post->filter = 'sample' à chaque objet de publication résout le problème. Mais il reste un mauvais pressentiment de pouvoir casser quelque chose. Le 'sample' dans $id/$post->filter semble assez étrange et je ne peux pas savoir d'où ça vient.

5
kaiser

Ma solution de contournement pour ce problème:

unset( $post->filter );

$url = get_permalink( $post );
4
scribu