web-dev-qa-db-ja.com

googleアナリティクスによる最も閲覧された投稿をループに追加する

私は私のループの中で(google analyticsから)最も見られた5つの投稿を表示するための解決策を見つけようとしています。

現時点で私が見つける唯一の方法は、このプラグイン「Google Analytics Top Content Widget」を使用することです。

しかし、私はそれを使用したくありません、そして、私はこのプラグインがすることができないよりそれのために本当に特定のレイアウトを持っているので私は私のループに追加できることを望みます。

どんな助けでも素晴らしいでしょう、

君たちありがとう !

1
tibewww

YoastのAnalyticsプラグインをお持ちの場合、これはそれほど難しいことではありません。しかしながら、それはいくらかのコーディング知識を必要とするでしょう。私はあなたのためにすべてを綴ることはしませんが、私はあなたを正しい方向に向けるつもりです。 Yoastがないと、たくさんのドキュメントをレビューする必要があります

  1. YoastからYoast GAファイル/クラスおよびAnalytics IDを読み込む(またはGoogle Client API自体を使用する)
  2. Analyticsから最も閲覧されているページをリクエストし、投稿IDを取得する
  3. 投稿とループを取得する

ここで例を作りました。テストされていないので正しく機能しない可能性がありますが、関数に投げ込んでそのまま試してください。これにはリフレッシュレートのオプション(分単位)とあなたのホームページを隠すオプションがあります(結局のところ、これは通常、最も閲覧されたページです)。

GA Top Contentプラグインからたくさん盗みました。

function jr_get_ga_top_posts() {
    $expires = 5; // minutes
    $showhome = false; // if you want to hide the homepage, set true

    if ( false === ( $post_ids = get_transient('jr_ga_top_posts') ) ) {

        // check for Yoast and include files
        if ( ! class_exists( 'Yoast_Google_Analytics' ) ) {
            return;
        }

        if ( ! is_admin() ) {
            $path = dirname( GAWP_FILE );
            $files_to_include = array(
                'Yoast_Google_CacheParser'      => '/vendor/yoast/api-libs/google/io/Google_CacheParser.php',
                'Yoast_Google_Utils'            => '/vendor/yoast/api-libs/google/service/Google_Utils.php',
                'Yoast_Google_HttpRequest'      => '/vendor/yoast/api-libs/google/io/Google_HttpRequest.php',
                'Yoast_Google_IO'               => '/vendor/yoast/api-libs/google/io/Google_IO.php',
                'Yoast_Google_WPIO'             => '/vendor/yoast/api-libs/google/io/Google_WPIO.php',
                'Yoast_Google_Auth'             => '/vendor/yoast/api-libs/google/auth/Google_Auth.php',
                'Yoast_Google_OAuth2'           => '/vendor/yoast/api-libs/google/auth/Google_OAuth2.php',
                'Yoast_Google_Cache'            => '/vendor/yoast/api-libs/google/cache/Google_Cache.php',
                'Yoast_Google_WPCache'          => '/vendor/yoast/api-libs/google/cache/Google_WPCache.php',
                'Yoast_Google_Client'           => '/vendor/yoast/api-libs/google/Google_Client.php',
                'Yoast_Google_Analytics_Client' => '/vendor/yoast/api-libs/googleanalytics/class-google-analytics-client.php',
            );

            if ( version_compare( GAWP_VERSION, '5.4.3' ) >= 0 ) {
                unset( $files_to_include['Yoast_Google_Analytics_Client'] );
                $files_to_include['Yoast_Api_Google_Client'] = '/vendor/yoast/api-libs/class-api-google-client.php';
            }

            foreach ( $files_to_include as $class => $file ) {
                require_once $path . $file;
            }
        }

        $options = Yoast_GA_Options::instance()->options;
        $ga_id = isset( $options['analytics_profile'] ) ? $options['analytics_profile'] : '';

        // this might be the end
        if ( empty( $ga_id ) )
            return;

        $params = array(
            'ids'         => 'ga:'. $ga_id,
            'dimensions'  => 'ga:pageTitle,ga:pagePath',
            'metrics'     => 'ga:pageViews',
            'sort'        => '-ga:pageviews',
            'filters'     => urlencode( 'ga:pagePath=~' . $link_uri . '.*' ),
            'max-results' => 100,
        );

        $response = Yoast_Google_Analytics::get_instance()->do_request( add_query_arg( $params, 'https://www.googleapis.com/analytics/v3/data/ga' ) );

        $pages = isset( $response['response']['code'] ) && 200 == $response['response']['code']
            ? wp_remote_retrieve_body( $response )
            : array();

        $counter = 1;
        $maxpost = 5;
        $post_ids = array();

        foreach ( $pages as $page ) {
            // stop when reaching 5
            if ( $counter > $maxpost )
                break;

            $url = $page['path'];

            // Url is index and we don't want the homepage, skip
            if ( $url == '/' && ! $showhome ) {
                continue;
            }

            // We need to check if there are duplicates
            $default_permalink = strpos( $url, '?p=' );
            $query_var = strpos( $url, '?' );
            $and_var = strpos( $url, '&' );

            // Strip the query var off the url (if not using default permalinks)
            $url = ( false !== $query_var && false === $default_permalink )
                ? substr( $url, 0, $query_var )
                : $url;

            $and_var = strpos( $url, '&' );

            // strip extra args from ?p=id
            if ( $default_permalink && false !== $and_var ) {
                $url = substr( $url, 0, $and_var );
            }

            $post_id = url_to_postid( $url );

            if ( empty( $post_id ) || in_array( $post_id, $post_ids ) )
                continue;

            $post_ids[] = $post_id;
            $counter++;
        }

        set_transient('jr_ga_top_posts', $post_ids, $expires * MINUTE_IN_SECONDS );
    }

    // we can't go any further
    if ( empty( $post_ids ) )
        return;

    $query = new WP_Query( array(
        'post__in' => $post_ids,
    ) );

    return $query;
}

$top_posts = jr_get_ga_top_posts();

if ( ! empty( $top_posts ) {
    while( $top_posts->have_posts() ) : $top_posts->the_post();
        // loop...
    endwhile;
}
1
johnrom