web-dev-qa-db-ja.com

get_post_metadata()がRSSテンプレートのループで使用された場合未定義

私はget_post_metadata()の使い方を理解していますが、このコードはカスタムRSSフィードテンプレートにあります。

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);

    [...]

差し上げております:

HP致命的エラー:不明なエラー:/srv/www/foo/htdocs/wp-content/themes/bar/feed-feature.phpにある未定義の関数►get_post_meta()を呼び出します

(そして実際にPhpStormエディタはそれに応じてそれを強調していますが、xdebugブレークポイントを設定すれば、私はそれをデバッグコンソールでうまく動かすことができます。

テンプレートはfunctions.phpにあり、次のように呼び出されます。

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

これは回避策ですが、それは私のための問題を解決しました。

最初に私はこのサイトを私のvvvからvvv2 dev環境に移動しました。それから私はWP configファイルと残りのfunctions.phpを注意深く調べて物事を壊す可能性のあるものを探しました。

これまでのところ運はありません。

私はget_post_meta()をソースでたどりましたが、自分で同等の関数を書き直すことによってのみ解決できると思います(必要に応じてDBクエリを作成する) get_metadata() の単純なラッパーです。何らかの理由で、このは動作します

もし誰かがget_post_meta()が未定義でget_metadata()がなぜ定義されていないのかを示唆できるのであれば...

0
William Turrell

RSSアイテムの<link>ノード値を変更するには、the_permalink_rssフィルタを使います。これは以下のコードで示されています。ここで、feature投稿に_featureurlの値が設定されている場合は、カスタム値が返されます。そうでなければ、デフォルトのパーマリンクが返されます。

/**
 * 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;     
    }
}

次のURLを持つfeature投稿タイプのRSS出力例。

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

<link>ノードの下の<item>ノードには、https://google.comというURLが含まれています。これは、_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