複数のカスタムフィールドをキーにしたエントリーの表示順の設定

120 views
Skip to first unread message

Shinobu Tsutsui

unread,
Aug 29, 2017, 2:09:58 AM8/29/17
to a-blog cms forum
いつもお世話になっております。筒井です。

現在複数のカスタムフィールドを使った
検索システムを開発しているのですが、

表示順を特定のカスタムフィールドに指定することは可能でしょうか。
単一のカスタムフィールドの場合 field-asc などが使用できますが、
複数のカスタムフィールドの場合どれが使用されているか不明でした。

JSONなどにしてJavaScript側でソートをかけることも検討していますが、
データが1000件を超えるためCMS側で処理できればよいなと思っています。

ご確認のほどよろしくお願い申し上げます。

伊藤淳

unread,
Aug 29, 2017, 3:09:36 AM8/29/17
to a-blog cms forum
お世話になっております。伊藤です。

> 表示順を特定のカスタムフィールドに指定することは可能でしょうか。
> 単一のカスタムフィールドの場合 field-asc などが使用できますが、
> 複数のカスタムフィールドの場合どれが使用されているか不明でした。

こちらはカスタムフィールドで絞り込んだ時の一番初めに指定されているカスタムフィールドを使ってソートするようになっております。

よろしくお願いいたします。

Shinobu Tsutsui

unread,
Aug 29, 2017, 7:51:54 AM8/29/17
to a-blog cms forum
伊藤様
お世話になっております。筒井です。

早速の返信ありがとうございました!

URLコンテキストのページに記載がありましたね。。大変失礼いたしました。

こちらの投稿と合わせて解決の糸口が見えてきました!

ちなみにカスタムフィールドの有無でソートをかけつつ、全記事を表示させたいのですが、
全記事表示させる場合はORで共通のカスタムフィールドで検索するしかないでしょうか。

▽ピックアップを上位表示する例
/knowledge/search.html/field/pickup/gte/0/_or_/全記事共通で使用しているカスタムフィールド/nem/order/intfield-desc/

よろしくお願い申し上げます。

伊藤淳

unread,
Aug 29, 2017, 9:16:18 PM8/29/17
to a-blog cms forum
お世話になっております。伊藤です。

> ちなみにカスタムフィールドの有無でソートをかけつつ、全記事を表示させたいのですが、
> 全記事表示させる場合はORで共通のカスタムフィールドで検索するしかないでしょうか。

こちらですが、例えば、hoge というフィールドがあって、全件表示しhogeフィールドでソートしたい場合は、
hoge/neq/dummy など 存在しない値でない場合という風に絞り込むか、必須のフィールドの場合は、 hoge/nem/ とする方法があるかと思います。

以上、よろしくお願いいたします。

Shinobu Tsutsui

unread,
Aug 31, 2017, 10:03:45 PM8/31/17
to a-blog cms forum
早速ご回答ありがとうございました!
neq を試してみたところ、存在しない値は引っかからないようでした。
幸いにも値が存在しない記事は少なかったので、何とかなりました!

動的にソートするカスタムフィールドを出力するなどして、
無事、検索システムを構築することができました。
ありがとうございました!



▼JavaScript

  /*
  /*  並び替えにより検索条件を変更
  */

 
function beforeSubmit(submit){
   
var $form = $('.knowledge-search'),
        order
= $form.find('[name="js-order-radio"]:checked').val();

   
// 検索条件を一旦リセット
    $form
.find('.js-order-parameter').remove();
    $form
.find('.js-order-empty').remove();

   
// オススメ順、指標1順、指標2順、指標3順
   
if( order == 'priority' || order == 'performance1' || order == 'performance2' || order == 'performance3' ){
      $form
.prepend('<input type="hidden" class="js-order-parameter" name="knowledge_'+order+'@operator" value="nem" />');
      $form
.prepend('<input type="hidden" class="js-order-parameter" name="field[]" value="knowledge_'+order+'" />');
      $form
.prepend('<input type="hidden" class="js-order-parameter" name="order" value="intfield-desc">');
     
// 検索条件が何も無い時
     
if( $form.find('input[type="checkbox"]:checked').size() == 0 && $form.find('input[type="text"]').val() == '' ){
        $form
.append('<input type="hidden" class="js-order-empty" name="entry-label@operator" value="nem">');
        $form
.append('<input type="hidden" class="js-order-empty" name="entry-label@separator" value="or">');
        $form
.append('<input type="hidden" class="js-order-empty" name="field[]" value="entry-label">');
     
}
   
}

   
// サブミットフラグがあれば、フォームをサブミットする ※submit()では動作しない
   
if( submit ){
      $form
.find('[type="submit"]').trigger('click');
   
}
 
}

 
// 並び替え条件を変更した時
  $
('.knowledge-search input[name="js-order-radio"]').change(function(){
    beforeSubmit
(true);
 
});

 
// 検索ボタンを押下した時
  $
('.knowledge-search button[type="submit"]').submit(function(){
    beforeSubmit
(true);
   
return false;
 
});



▼HTML

  <p class="knowledge-search-order">
    並び替え:
   
<label class="radio"><input type="radio" name="js-order-radio" value="priority" <!-- BEGIN_IF [%{FIELD_PATTERN}/re/priority] -->checked<!-- END_IF -->> <span>オススメ順</span></label>
   
<label class="radio"><input type="radio" name="js-order-radio" value="datetime" <!-- BEGIN_IF [%{FIELD_PATTERN}/eq/] -->checked<!-- END_IF -->> <span>新着順</span></label>
   
<label class="radio"><input type="radio" name="js-order-radio" value="performance1" <!-- BEGIN_IF [%{FIELD_PATTERN}/re/performance1] -->checked<!-- END_IF -->> <span>指標1順</span></label>
   
<label class="radio"><input type="radio" name="js-order-radio" value="performance2" <!-- BEGIN_IF [%{FIELD_PATTERN}/re/performance2] -->checked<!-- END_IF -->> <span>指標2順</span></label>
   
<label class="radio"><input type="radio" name="js-order-radio" value="performance3" <!-- BEGIN_IF [%{FIELD_PATTERN}/re/performance3] -->checked<!-- END_IF -->> <span>指標3順</span></label>
 
</p>


▼Hook.php

    public function extendsGlobalVars(&$globalVars)
   
{
       
// URLコンテキスト上で指定されたフィールドからパラメータのみを取り出す
       
if( FIELD ){
            $globalVars
->set('FIELD_PATTERN', str_replace('/', '|', FIELD));
       
}
   
}



伊藤淳

unread,
Sep 4, 2017, 7:42:52 AM9/4/17
to a-blog cms forum
お世話になっております。伊藤です。

無事、フィールド検索のソートが動くようになってよかったです。
また、詳しいコードもありがとうございます!すごく複雑な検索でびっくりしました。
同じような事をやりたい人の参考にすごくなると思います。

今後ともよろしくお願いいたします。

Reply all
Reply to author
Forward
0 new messages