如何将WP_QUERY(自定义帖子类型,带有自定义域)的结果转换为JavaScript?

时间:2016-09-15 作者:davemackey

我正在上使用DataTablesthis page.

它工作得很好,只是我在让孩子们排起队来时遇到了麻烦。

我认为我需要做的是将带有相关自定义字段的WP\\U查询结果转换为JavaScript数组。

以这种方式获取WP\\u查询的结果很容易,但当您将自定义字段添加到混合中时,我就卡住了。

关于如何实现这一点,有什么想法吗?您可以查看页面的源代码here.

3 个回复
SO网友:Rarst

如何编写返回自定义字段数据的WP\\U查询

这通常不是必需的。您可以简单地单独访问查询中每个帖子的元数据(就像您已经做的那样)。您还可以在一个页面中多次迭代查询(它会自动倒带开始,这就是while( have_posts() ) 零件有)。

如果您关心性能方面,元数据访问大量缓存在内存(或对象缓存)中。在页面加载中多次检索元数据不会导致重复查询,只会提取一次并重新使用。

SO网友:kaiser

下面是一个过于简化的示例,说明了您可能需要执行的操作:使用JsonSerializable:

class \\JsonQuery extends \\WP_Query implements \\JsonSerializable
{
    public function jsonSerialize()
    {
        return array_map( function( \\WP_Post $post ) {
            return array_merge( 
                $post->to_array(),
                get_post_custom( $post->ID )
            );
        }, $this->get_posts() )
    }
}
就这么简单(…以上)。现在只需查询您需要的任何内容

// Enqueue script here!
$query = new \\JsonQuery( [
    /* arguments you use in normal \\WP_Query */
] );
wp_localize_script( \'script-handle\', \'globalJsVarName\', json_encode( $query ) );
然后将JSON编码的查询与所有post自定义数据放在一起。

注:

上面的代码没有经过测试(实际上我有两个电话,所以可能有点不对劲)

  • 请确保预先将脚本排队,以便您可以本地化它的数据

    编辑

    您可能需要编写Decorator 对于\\WP_Query 而不是扩展它。互联网会告诉你优点/缺点,因此无需在此重复。

  • SO网友:Faye

    好的,我想我理解你的要求,请告诉我我在左外野。

    首先,您需要看看以下内容:https://aarontgrogg.com/blog/2015/12/16/getting-to-know-and-adding-json-ld-to-a-wordpress-site/

    现在我专门使用它来获取模式数据,但我相信您可以提供其他类型的有效负载,例如javascript。

    接下来的主要问题是如何将自定义字段数据获取到有效负载中,我想这就是您真正想问的问题?

    无论如何,使用该链接中描述的方法来创建json,我已经想到了这个问题-

    <?php include(\'json-ld.php\');?>
    <script type="application/ld+json"><?php echo json_encode($payload); ?></script>
    
    然后在我的json ld中。php文件我有:

    <?php 
    // JSON - LD for Reaction 
    
    // Global Call
    
    function get_post_data() {
        global $post;
        return $post;
    }
    
    
    $post_data = get_post_data();
    $payload["@context"] = "http://schema.org/";
    
    //blog posts
    
    if (is_singular(\'post\')) {
    
        //variables for the post
    
        $post_url = get_permalink();
        $post_thumb = wp_get_attachment_url(get_post_thumbnail_id($post->ID));
        $excerpt= get_the_excerpt($post->ID); //  grab the post excerpt.
        $author_select = get_field(\'author\', $post->ID);
        $moddatetime = new DateTime($post_data->post_date); 
    
    
        // getting the team member
    
    
        if ($author_select == \'reaction\') {
    
            $postauthor = \'Reaction\';
    
        } 
    
        else if ($author_select == \'guest\') { 
    
             $postauthor = get_field(\'guest_writer_name\', $post->ID);
    
        } else {
    
            $author = get_field(\'team_member\', $post->ID);
                foreach($author as $member) {               
                $postauthor = $member->post_title;
            }
    
        }
    
        // getting the tags
    
        $posttags = get_the_tags();
        if ($posttags) {
          foreach($posttags as $tag) {
           $value .= $tag->name . \', \'; 
          }
        }
        $value = rtrim($value,\', \');
    
    
        //payload
    
        $payload["@type"] = "blogPost";
        $payload["url"] = $post_url;
        $payload["creator"] = array(
            "@type" => "Person", 
            "name" => $postauthor, // outputs my post author as per the calls above
            ); 
    
        $payload["headline"] = $post_data->post_title; // works
        $payload["datePublished"] = $moddatetime->format(DateTime::ISO8601);  // works
        $payload["image"] = $post_thumb;
        $payload["description"] = $excerpt; // works
        $payload["about"] = $value; // works
    
    }
    
    
    // home page
    
    if (is_front_page()) {
    
        $logourl = get_site_url();
    
    
        $payload["@type"] = "Organization";
        $payload["name"] = "Reaction Marketing";
        $payload["logo"] = $logourl . \'/reaction-logo.png\';
        $payload["url"] = get_site_url();
        $payload["sameAs"] = array("http://twitter.com/reaction", "https://www.facebook.com/ReactionMarketing", "http://www.linkedin.com/company/reaction-marketing");
        $payload["contactPoint"] = array(array("@type" => "ContactPoint", "telephone" => "+1 403 346 6580", "email" => "[email protected]", "contactType" => "sales"));
    }
    
    ?>
    
    我的最终结果是一个适合页面和帖子的模式。主页输出示例如下:

    <script type=\'application/ld+json\'>{"@context":"http:\\/\\/schema.org","@type":"WebSite","url":"http:\\/\\/reaction.ca\\/","name":"Reaction","alternateName":"Reaction","potentialAction":{"@type":"SearchAction","target":"http:\\/\\/reaction.ca\\/?s={search_term_string}","query-input":"required name=search_term_string"}}</script>
    <script type=\'application/ld+json\'>{"@context":"http:\\/\\/schema.org","@type":"Organization","url":"http:\\/\\/reaction.ca\\/","sameAs":["https:\\/\\/www.facebook.com\\/ReactionMarketing","https:\\/\\/www.instagram.com\\/reaction","https:\\/\\/www.linkedin.com\\/company\\/reaction-marketing","https:\\/\\/twitter.com\\/reaction"],"name":"Reaction Marketing","logo":"http:\\/\\/reaction.ca\\/uploads\\/REACTION-RGB.jpg"}</script>
    
    现在,很明显,这是特定于模式的,但您可以在其中看到,我已经调用了特定于各种自定义字段的数据(使用ACF)。您可以在那里的博客帖子中看到我的变量是如何被调用的。

    这似乎符合你的要求吗?