投稿したのページめくりの順番を変えたい

0
Who liked: No user
  • このトピックには21件の返信、3人の参加者があり、最後にアバター画像otomewebにより1週、 3日前に更新されました。
7件の投稿を表示中 - 16 - 22件目 (全22件中)
  • 投稿者
    投稿
  • #140046
    アバター画像otomeweb
    参加者
    22

    いろいろご提案いただいて恐縮です。
    わたしの知識では、一覧のソートと同じ程度のコードで並び変えできたらなという希望的観測で
    聴いておりました。でも根は深いのですね

    ご提案いただいたプラグイン、たしかに一括ソートがついてるようでした
    ただ、ソートキーの設定にWordPressのコアを指定しないといけないような画面もあったので
    わたしに使い切れるかわかりません。

    編集長に相談して別セクションのエンジニアにバトンタッチすることになりました
    エンジニアがいままでいただいた情報を拝見して、コードを書くか、プラグインを買うことを
    編集長に提案するかになります。編集長は1日もあればコード架けるだろう的に気楽に構えていて
    プラグインに投資しようとしないので、いや、そんな簡単なことじゃないと伝えます

    エンジニアも普段カスタムテーマをメンテナンスしていて、Snow Monkeyは初めてなのです
    もしかしたら、自分でコード書いてみたいというかもしれません

    まだサイトが収益化できておらず、わたしもエンジニアも副業での参加なので、
    なかなか有料プラグインの許可がおりないです

    いったんわたしの手をはなします
    エンジニアがコードを書いた場合は、極力コミュニティに戻せるように頼んでみます

    まずはここまでありがとうございました。

    3
    Who liked:
    #141305
    アバター画像otomeweb
    参加者
    22

    ご連絡おくれてすみません

    現在校正作業をしながら、ソートキーを付与する作業をしています。
    現在50% これがおわったら、Advanced Post Types Orderを購入して
    試して見たいと思ってます

    それまでトピックを開いたままにさせて下さい

    0
    Who liked: No user
    #142416
    アバター画像otomeweb
    参加者
    22

    こちら、やっと購入した、指定のプラグインをつかったのですが
    一覧ページではソートできたものの、ページめくりはかわりませんでした

    どうもページめくりは、ソートとは関係ない?? いや取り出す順番はソートですよね

    ChatGPTで作成したコードだと、次へはOKだけど、前へはダメでした
    アイキャッチが飛ぶのは別に問題なし、なんらかの色にCSSでできれば充分です

    このコードがうまくいったのか分からないのですが参考までにアップします

    — ここから —

    前のコードに戻しつつ、前の項目が常に最初のものになってしまう問題を解決する方法に焦点を当てて修正します。meta_compareやmeta_valueの使い方に加え、カスタムフィールドの順番取得が安定するように再調整します。

    以下は、前々のコードの基本構造を保持しつつ、改善を加えた修正版です。

    // furigana に基づいて次または前の投稿を取得する関数
    function get_adjacent_post_by_furigana($direction = 'next') {
        global $post;
    
        // 現在の投稿の 'furigana' 値を取得
        $current_furigana = get_post_meta($post->ID, 'furigana', true);
    
        // クエリの方向を決定
        $order = ($direction === 'next') ? 'ASC' : 'DESC';
        $comparison_operator = ($direction === 'next') ? '>' : '<';
    
        // furigana のカスタムフィールドを基に前後の記事を取得
        $args = array(
            'post_type' => $post->post_type,
            'posts_per_page' => 1,
            'meta_key' => 'furigana',
            'meta_value' => $current_furigana,
            'meta_compare' => $comparison_operator,
            'orderby' => 'meta_value',
            'order' => $order,
            'meta_type' => 'CHAR',  // furiganaは文字列型として扱う
            'suppress_filters' => false, // カスタム投稿タイプなどに対応
            'fields' => 'ids',  // ID のみを取得
        );
    
        // クエリ実行
        $adjacent_posts = get_posts($args);
    
        // 結果があればその投稿の ID を返す
        if (!empty($adjacent_posts)) {
            return $adjacent_posts[0]; // 次または前の投稿を返す
        }
    
        return null;  // 結果がなければ null を返す
    }
    
    // カスタムフィールド 'furigana' に基づいて前後リンクをカスタマイズする関数
    function custom_adjacent_post_link($output, $format, $link, $post, $adjacent) {
        // クエリの方向を設定
        $direction = ($adjacent === 'next') ? 'next' : 'prev';
    
        // カスタムクエリで次または前の投稿を取得
        $adjacent_post_id = get_adjacent_post_by_furigana($direction);
    
        if ($adjacent_post_id) {
            $adjacent_link = get_permalink($adjacent_post_id);
            $adjacent_title = get_the_title($adjacent_post_id);
    
            // リンクを生成
            $link_format = '<a href="' . esc_url($adjacent_link) . '">' . esc_html($adjacent_title) . '</a>';
            $output = str_replace('%link', $link_format, $format);
        }
    
        return $output;
    }
    
    // フィルターを使用して前後リンクをカスタマイズ
    add_filter('next_post_link', 'custom_adjacent_post_link', 10, 5);
    add_filter('previous_post_link', 'custom_adjacent_post_link', 10, 5);

    改良点の説明

    1. 基本ロジックを保持: 前のコードのロジックを維持し、furiganaカスタムフィールドに基づいた投稿の前後リンクを取得するようにしています。
    2. 前の投稿が最初のものにならないように修正: meta_compareとmeta_valueの使い方を保持しつつ、クエリの順序を適切に調整することで、前の投稿が常に最初のものにならないようにしています。
    3. 最適化のためのフィルタリング: posts_per_pageを1に設定して、常に1件だけ(前または次)の投稿を取得するようにしています。

    デザインに影響しないようなリンク生成

    テンプレートをいじれない前提のため、WordPressのフィルターを使ってnext_post_linkとprevious_post_linkを置き換え、適切に前後のリンクを表示する方法を採用しています。

    動作確認

    これで、前後の投稿がfuriganaカスタムフィールドに基づいて正しく取得されることを期待しています。

    次へは大丈夫ですが、前へがダメです。ただ夜も遅くなったので、いったんここまでにしましょう。もう一歩なのですが

    0
    Who liked: No user
    #142534
    アバター画像otomeweb
    参加者
    22

    ご提案いただいた

    並び替えプラグイン
    Advanced Post Types Order

    を購入してソートしてみたのですが、一覧はソートされたけど
    ページめくりは仕組みがちがうようで並び替えされませんでした

    現在ページめくりをCSSで非表示にしてます。

    これ投稿のページめくりを50音順にするのは結構難しいでしょうか?

    0
    Who liked: No user
    #142550
    アバター画像キタジマ タカシ
    参加者
    2421

    前述したように難しい部類のカスタマイズだと思います。

    ↑前回共有したページですが、ここに get_adjacent_post() のコードが書いてあります。コードを読むと、get_posts() ではなく SQL で前後の投稿を取得しているのわかるかと思います。

    SQL のソート部分にフィルターフックが仕込んであって、

    apply_filters( "get_{$adjacent}_post_sort", "ORDER BY p.post_date $order LIMIT 1", $post, $order );
    

    のようになっているので、カスタマイズするならここなのかなと想像しています。Advanced Post Types Order の機能の詳細がわかりませんが、Advanced Post Types Order で並び替えたときに各投稿の menu_order が適宜更新されるのであれば、上記のフックで post_date ではなく menu_order を基準にソートするようにさせることで実現できるかもしれません。

    もしそれが無理であれば完全に自作するレベルになると思うので、どなたかに依頼して開発してもらうのが良いのではないかと個人的には思います。

    0
    Who liked: No user
    #142573
    アバター画像otomeweb
    参加者
    22

    前後のリンクそれぞれにSQLへのコールが埋め込まれているということですね。
    そうすると、単純なソートの問題ではなくなるので難しいことはわかりました。

    編集長にこの件を説明して、まずは前後リンクを無くすこと。
    どうしても前後リンクがほしければ、エンジニアチームにスレッドをよんでもらって
    バトンタッチすることにします。UXデザイナーの範疇を超えてると判断しました

    Advanced Post Types Orderも結構,複雑なプラグインなので
    どういう動作の仕組みなのかわかりません。わたしがもう少しコードを書ければ
    好奇心はあるんですけど…

    ありがとうございました。
    ご返事いただいてクローズにしたいと思います

    0
    Who liked: No user
    #142633
    アバター画像otomeweb
    参加者
    22

    別スレッドに移動したので閉じます

    0
    Who liked: No user
7件の投稿を表示中 - 16 - 22件目 (全22件中)
  • トピック「投稿したのページめくりの順番を変えたい」には新しい返信をつけることはできません。

ドキュメント

Snow Monkey の設定方法やマニュアルを掲載しています。

ドキュメント

フォーラム

Snow Monkey の使い方やカスタマイズについてのご質問・ご要望等はサポートフォーラムで行っています。サポートフォーラムは誰でも閲覧できますが、書き込みできるのは Snow Monkey 購入者のみとなります。

サポートフォーラム

よくあるご質問

Snow Monkey のサービスについて不明な点がある場合は、まずはよくあるご質問をご確認ください。

よくあるご質問

お問い合わせ

よくあるご質問を見ても解決しなかった場合、試用版の申請については問い合わせフォームからお願いいたします。

お問い合わせ

Snow Monkey は Gutenberg ブロックエディターに対応した 100%GPL の WordPress テーマです。拡張性を意識した開発をおこなっており、カスタマイザーとブロックでスピーディーにサイトを立ち上げるだけでなく、CSS やフックを駆使した高度なカスタマイズにも柔軟に対応できます。