web-dev-qa-db-fra.com

get_post_metadata () undefined utilisé en boucle dans un modèle RSS

Je comprends comment utiliser get_post_metadata(), toutefois ce code dans un modèle de flux RSS personnalisé:

while( have_posts()) : the_post();

    // Has a custom URL been supplied? Use that in preference.
    $feature_permalink = ‌‌get_post_meta(get_the_ID(), '_featureurl', true);

    [...]

donne:

Erreur HP Fatal: Erreur non capturée: appel de la fonction non définie get_post_meta () dans /srv/www/foo/htdocs/wp-content/themes/bar/feed-feature.php

(et en effet l'éditeur de PhpStorm le souligne en conséquence, mais avec un point d'arrêt xdebug, je peux l'exécuter correctement dans la console de débogage. Tous les autres appels de fonction de flux - pour le permalien standard, le titre, le guide, etc. - fonctionnent correctement.)

Le modèle est en functions.php, appelé avec:

function foo_custom_rss() {
    if ( in_array('feature', get_query_var('post_type')) ) {
        get_template_part( 'feed', 'feature' );
    } else {
        get_template_part( 'feed', 'rss2' );
    }
}

remove_all_actions( 'do_feed_rss2' );
add_action( 'do_feed_rss2', 'foo_custom_rss', 10, 1 );
1
William Turrell

C'est une solution de contournement, mais cela a résolu le problème pour moi.

D'abord, j'ai déplacé ce site de mon environnement de développement vvv vers un environnement de développement vvv2, afin d'éliminer tout problème là-bas. Ensuite, j'ai parcouru les WP fichiers de configuration et le reste du fichier functions.php en recherchant attentivement tout ce qui pourrait potentiellement casser des objets.

Pas de chance jusqu'à présent.

J'ai tracé get_post_meta () dans le code source, pensant pouvoir résoudre ce problème uniquement en réécrivant moi-même une fonction équivalente (en créant une requête de base de données si nécessaire). Les lecteurs le savent peut-être. simplement un wrapper pour get_metadata () - pour une raison quelconque, cela fonctionne .

Donc, si quelqu'un peut suggérer pourquoi get_post_meta () n'est pas définie et get_metadata () n'est pas ...

0
William Turrell

Pour modifier la valeur du noeud <link> d'un élément RSS, utilisez le filtre the_permalink_rss. Ceci est démontré dans le code ci-dessous où, si une publication feature a une valeur définie pour _featureurl, nous renverrons la valeur personnalisée. Sinon, le permalien par défaut est renvoyé:

/**
 * Filters the permalink to the post for use in feeds.
 *
 * @param string $post_permalink The current post permalink.
 */
add_filter( 'the_permalink_rss', 'wpse_the_permalink_rss', 10, 1 );
function wpse_the_permalink_rss( $post_permalink ) {
    // Bail if this is not a feature.
    if ( 'feature' !== get_query_var( 'post_type') ) {
        return $post_permalink;
    }

    // Get the permalink URL.
    $feature_permalink = get_post_meta( 
            get_the_ID(),
            '_featureurl',
            true 
    );

    // If the the custom URL has been specified return it, otherwise, use default permalink.
    // Note: This is run through esc_url() via the_permalink_rss().
    if ( $feature_permalink  ) {
        return $feature_permalink; 
    } else {
        return $post_permalink;     
    }
}

Exemple de sortie RSS pour le type d'article feature, dont l'URL est la suivante:

http://example.com/feed/?post_type=feature

Notez que le noeud <link> sous le noeud <item> contient l'URL https://google.com, qui correspond à ce que j'ai défini pour le champ personnalisé _featureurl:

<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
    xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:atom="http://www.w3.org/2005/Atom"
    xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    >

<channel>
    <title>Features &#8211; WP Theme Testing</title>
    <atom:link href="http://localhost/wp-theme-testing/feed/?post_type=feature" rel="self" type="application/rss+xml" />
    <link>http://localhost/wp-theme-testing</link>
    <description>I &#60;3 testing themes!</description>
    <lastBuildDate>Sun, 04 Mar 2018 05:46:16 +0000</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <generator>https://wordpress.org/?v=4.9.1</generator>

<image>
    <url>http://localhost/wp-theme-testing/wp-content/uploads/2017/06/cropped-favicon-32x32.png</url>
    <title>Features &#8211; WP Theme Testing</title>
    <link>http://localhost/wp-theme-testing</link>
    <width>32</width>
    <height>32</height>
</image> 
    <item>
        <title>test feature</title>
        <link>https://google.com</link>


        <comments>http://localhost/wp-theme-testing/feartures/test-feature/#respond</comments>
        <pubDate>Sun, 04 Mar 2018 05:41:29 +0000</pubDate>
        <dc:creator><![CDATA[dave]]></dc:creator>

        <guid isPermaLink="false">http://localhost/wp-theme-testing/?post_type=feature&#038;p=3035</guid>
        <description><![CDATA[a test!]]></description>
                <content:encoded><![CDATA[<p>a test!</p>
]]></content:encoded>
            <wfw:commentRss>http://localhost/wp-theme-testing/feartures/test-feature/feed/</wfw:commentRss>
        <slash:comments>0</slash:comments>
        </item>
    </channel>
</rss>
1
Dave Romsey