web-dev-qa-db-ja.com

WP_Query(カスタム投稿タイプ、カスタムフィールドあり)の結果をJavaScriptに変換する方法を教えてください。

このページでデータテーブルを使用しています。

私は子の行を動作させるのに苦労したことを除いて、それは素晴らしい作品です。

私は、WP_Queryの結果とそれに関連付けられたカスタムフィールドをJavaScriptの配列に変換する必要があると思います。

この方法でWP_Queryの結果を取得するのは十分に簡単ですが、カスタムフィールドをミックスに追加すると、うまくいきません。

これをどのように達成できるかについてのアイデアはありますか?ページのソースコード はこちら で確認できます。

1
davemackey

カスタムフィールドデータを返すWP_Queryの書き方

これは通常必要ありません。クエリ内の各投稿のメタデータに個別にアクセスすることができます(既に行っているように)。また、ページ内でクエリを複数回繰り返すこともできます(itが自動的に開始するまで巻き戻します。これがwhile( have_posts() )部分の動作です)。

パフォーマンス面が気になる場合は、メタデータアクセスがメモリ(またはオブジェクトキャッシュ)に頻繁にキャッシュされます。ページロードでメタデータを複数回取得しても重複クエリは発生せず、1回だけ取得されて再利用されます。

1
Rarst

ここにあなたがしたいかもしれないことの過度に単純化された例があります: 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エンコードされたクエリをすべてのポストカスタムデータと一緒に持っています。

注意:

  1. 上記のコードはテストされていません(実際には間に2つの電話があったので、あちこちで少しずれている可能性があります)。
  2. スクリプトを事前にエンキューして、データをローカライズできるようにしてください。
  3. JSをフッターに入れるか(登録時の最後の引数)、または十分に早く照会するようにしてください - これでうまくいくかどうかわからない。

編集する

\WP_Queryを拡張するのではなく、 デコレータ を書くことをお勧めします。インターネットは長所/短所について教えてくれるので、ここでそれを繰り返す必要はありません。

1
kaiser

さて、私はあなたが求めているものを理解していると思います、私は左のフィールドにいると私に言ってください。

まず、これを見てみましょう。 https://aarontgrogg.com/blog/2015/12/16/getting-to-know-and-adding-json -ld-to-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を使用して)呼び出したことがわかります。私の変数がどのように呼び出されているかは、そこのブログ投稿で詳しく見ることができます。

これはあなたが求めていることに合うようですか?

0
Faye