質問編集履歴

2 誤字

saywo

saywo score 12

2019/05/09 19:30  投稿

Wordpressのカスタムフィールド(日付)で、カスタム投稿の記事一覧(archive-***.php)をソートしたい
### Wordpressのカスタムフィールド(日付)で、カスタム投稿の記事一覧(archive-***.php)をソートしたい
selectボックスを用いて、投稿タイプを年別(カスタムフィールドで入力)にソートしたいです
ネットで見つけたコードをコピペし、適宜変更しましたが、以下の点が上手くいかないので、コードの間違いを教えていただけると嬉しいです
####要点
**1.年別アーカイブページのURLが正しくならない**
(カスタム投稿アーカイブページ ***.com/wp/event/)
↓ ソート
現在の年別ソートURL ***.com/wp/2020/?meta_key=event_date
こうしたいURL .com/wp/event/2020/
**2.フィールドによるアーカイブページ(年別)が作られない**
### 該当のソースコード
### functions.php
```php
/カスタムフィールドの値で月別アーカイブ
function my_get_year_archives( $args = '' ) {
   global $wpdb, $wp_locale;
   $defaults = array(
       'date_field' => 'event_date', //カスタムフィールドのフィールド名を記述
       'format' => 'html',
       'echo' => true,
       'limit' => '',
       'before' => '',
       'after' => '',
       'show_post_count' => false,
   );
   $r = wp_parse_args( $args, $defaults );
   extract( $r, EXTR_SKIP );
   if ( '' != $limit ) {
       $limit = absint( $limit );
       $limit = ' LIMIT '.$limit;
   }
   $field = 'm.meta_value';
   $select = "SELECT SUBSTRING($field,1,4) AS `year`, count(p.ID) AS posts";
   $where = "WHERE p.post_type = 'event' AND p.post_status = 'publish'";
   $where .= $wpdb->prepare( ' AND m.meta_key = %s', $date_field );
   $join  = " INNER JOIN $wpdb->postmeta AS m ON m.post_id = p.ID";
   $where = apply_filters( 'getarchives_where', $where, $r );
   $join  = apply_filters( 'getarchives_join' , $join , $r );
   $output = '';
   $query = "$select FROM $wpdb->posts AS p $join $where GROUP BY SUBSTRING($field,1,4) ORDER BY $field DESC $limit";
   $key = md5( $query );
   $cache = wp_cache_get( 'my_get_year_archives' , 'general' );
   if ( !isset( $cache[ $key ] ) ) {
       $arcresults = $wpdb->get_results( $query );
       $cache[ $key ] = $arcresults;
       wp_cache_set( 'my_get_year_archives', $cache, 'general' );
   } else {
       $arcresults = $cache[ $key ];
   }
   if ( $arcresults ) {
       $afterafter = $after;
       foreach ( (array) $arcresults as $arcresult ) {
           $url = add_query_arg( array( 'meta_key' => $date_field ), get_year_link( $arcresult->year) );
           $text = sprintf( '%d', $arcresult->year ).'年';
           $output .= '<option value="'.$url.'">'.$text.'</option>';
       }
   }     
   if ( $echo )
       echo $output;
   else
       return $output;
}
add_action( 'init', 'my_init' );
function my_init() {
   global $wp;
   $wp->add_query_var( 'meta_key' );
}
function change_sort_order( $query ) {
   if ( is_admin() || ! $query->is_main_query() ) {
   return;
   }
   $currnet_date = date_i18n( 'y/m/d' );
   if ( $query->is_year() ) {
   $meta_query = array(
           array(
               'key'    => $query->get( 'meta_key' ),
               'value'  => $query->get( 'year' ).'.'.sprintf('%02d', $query->get( 'monthnum' )),
               'compare' => 'LIKE'
           ),
   );
   $thisyear = get_query_var('year');
   $thismon = get_query_var('monthnum');
   $query->set( 'meta_query', $meta_query );
   $query->set( 'year', '');
   $query->set( 'monthnum','');
   $query->set( 'thisyear',$thisyear);
   $query->set( 'thismon',$thismon);
   $query->set( 'orderby', 'meta_value' );
   $query->set( 'meta_key','開催日');
   $query->set( 'post_type','post');
   $query->set( 'meta_key','event_date');
   $query->set( 'post_type','event');
 }
}
add_action( 'pre_get_posts', 'change_sort_order' );
```
### 補足情報(FW/ツールのバージョンなど)
Wordpress5.2
  • PHP

    38098 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    15493 questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

1 文中のコメント消去

saywo

saywo score 12

2019/05/09 19:27  投稿

Wordpressのカスタムフィールド(日付)で、カスタム投稿の記事一覧(archive-***.php)をソートしたい
### Wordpressのカスタムフィールド(日付)で、カスタム投稿の記事一覧(archive-***.php)をソートしたい
selectボックスを用いて、投稿タイプを年別(カスタムフィールドで入力)にソートしたいです
ネットで見つけたコードをコピペし、適宜変更しましたが、以下の点が上手くいかないので、コードの間違いを教えていただけると嬉しいです
####要点
**1.年別アーカイブページのURLが正しくならない**
(カスタム投稿アーカイブページ ***.com/wp/event/)
 
↓ ソート
現在の年別ソートURL ***.com/wp/2020/?meta_key=event_date
 
こうしたいURL .com/wp/event/2020/
**2.フィールドによるアーカイブページ(年別)が作られない**
### 該当のソースコード
### functions.php  
```php
/カスタムフィールドの値で月別アーカイブ
function my_get_year_archives( $args = '' ) {
   global $wpdb, $wp_locale;
   $defaults = array(
       'date_field' => 'event_date', //カスタムフィールドのフィールド名を記述
       'format' => 'html',
       'echo' => true,
       'limit' => '',
       'before' => '',
       'after' => '',
       'show_post_count' => false,
   );
   $r = wp_parse_args( $args, $defaults );
   extract( $r, EXTR_SKIP );
   if ( '' != $limit ) {
       $limit = absint( $limit );
       $limit = ' LIMIT '.$limit;
   }
   $field = 'm.meta_value';
   $select = "SELECT SUBSTRING($field,1,4) AS `year`, count(p.ID) AS posts";
   $where = "WHERE p.post_type = 'event' AND p.post_status = 'publish'";
   $where .= $wpdb->prepare( ' AND m.meta_key = %s', $date_field );
   $join  = " INNER JOIN $wpdb->postmeta AS m ON m.post_id = p.ID";
   $where = apply_filters( 'getarchives_where', $where, $r );
   $join  = apply_filters( 'getarchives_join' , $join , $r );
   $output = '';
   $query = "$select FROM $wpdb->posts AS p $join $where GROUP BY SUBSTRING($field,1,4) ORDER BY $field DESC $limit";
   $key = md5( $query );
   $cache = wp_cache_get( 'my_get_year_archives' , 'general' );
   if ( !isset( $cache[ $key ] ) ) {
       $arcresults = $wpdb->get_results( $query );
       $cache[ $key ] = $arcresults;
       wp_cache_set( 'my_get_year_archives', $cache, 'general' );
   } else {
       $arcresults = $cache[ $key ];
   }
   if ( $arcresults ) {
       // $afterafter = $after;
       $afterafter = $after;
       foreach ( (array) $arcresults as $arcresult ) {
           $url = add_query_arg( array( 'meta_key' => $date_field ), get_year_link( $arcresult->year) );
           $text = sprintf( '%d', $arcresult->year ).'年';
           $output .= '<option value="'.$url.'">'.$text.'</option>';
       }
   }     
   if ( $echo )
       echo $output;
   else
       return $output;
}
add_action( 'init', 'my_init' );
function my_init() {
   global $wp;
   $wp->add_query_var( 'meta_key' );
}
function change_sort_order( $query ) {
   if ( is_admin() || ! $query->is_main_query() ) {
   return;
   }
   $currnet_date = date_i18n( 'y/m/d' );
   if ( $query->is_year() ) {
   $meta_query = array(
           array(
               'key'    => $query->get( 'meta_key' ),
               'value'  => $query->get( 'year' ).'.'.sprintf('%02d', $query->get( 'monthnum' )),
               'compare' => 'LIKE'
           ),
   );
   $thisyear = get_query_var('year');
   $thismon = get_query_var('monthnum');
   $query->set( 'meta_query', $meta_query );
   $query->set( 'year', '');
   $query->set( 'monthnum','');
   $query->set( 'thisyear',$thisyear);
   $query->set( 'thismon',$thismon);
   $query->set( 'orderby', 'meta_value' );
   $query->set( 'meta_key','開催日');
   $query->set( 'post_type','post');
 }
}
add_action( 'pre_get_posts', 'change_sort_order' );
```
### 補足情報(FW/ツールのバージョンなど)
Wordpress5.2
  • PHP

    38098 questions

    PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

  • WordPress

    15493 questions

    WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る