web-dev-qa-db-ja.com

ショートコードで、投稿の種類を超えて、タイトルのアルファベット順に次の投稿と前の投稿のリンクを取得する方法

"page-builder"タイプのCMS、具体的にはElegant ThemesによるDIVIテーマ を使用して、単一の投稿ページに次の投稿リンクと前の投稿リンクが必要です。そのため、ページビルダーを使用すると、テンプレート内のコントロールや多くのデフォルトテンプレートが非表示になるため、Shortcodesを使用して表示できるようにするためのリンクが必要です。また、私のクライアントは、投稿タイプに応じて、ページレイアウト内の前後の投稿コントロールが表示される場所を操作できる必要があります。それは理にかなっている。

そして、時系列ではなく、アルファベット順に次/前のページに移動する必要があります(デフォルト)。

最後に、私は複数のカスタム投稿タイプがあり、それらはすべて同じタイプのフィルタリングが必要です。

5
Will Lanni

そのためには、SQLクエリをフィルタリングする必要がありました。 このスニペット はタイトルで投稿順を絞り込み、前後の投稿リンクにそれらを返します。残念ながら、これはカスタム投稿タイプでは機能しません。そこで私は現在の投稿タイプを取得して返すために 'post'をget_post_type($post)に置き換えました。これにより、カスタム投稿タイプでこれを機能させることができます。また、必要に応じて、ブログ投稿ではなくカスタム投稿タイプでのみ機能するように制限することもできます。私はここでそれをしませんでした、しかしそれは可能です。これが私のfunctions.phpに入れたコードです:

function filter_next_post_sort($sort) {
    $sort = "ORDER BY p.post_title ASC LIMIT 1";
    return $sort;
}
function filter_next_post_where($where) {
    global $post, $wpdb;
    return $wpdb->prepare("WHERE p.post_title > '%s' AND p.post_type = '". get_post_type($post)."' AND p.post_status = 'publish'",$post->post_title);
}

function filter_previous_post_sort($sort) {
    $sort = "ORDER BY p.post_title DESC LIMIT 1";
    return $sort;
}
function filter_previous_post_where($where) {
    global $post, $wpdb;
    return $wpdb->prepare("WHERE p.post_title < '%s' AND p.post_type = '". get_post_type($post)."' AND p.post_status = 'publish'",$post->post_title);
}

add_filter('get_next_post_sort',   'filter_next_post_sort');
add_filter('get_next_post_where',  'filter_next_post_where');

add_filter('get_previous_post_sort',  'filter_previous_post_sort');
add_filter('get_previous_post_where', 'filter_previous_post_where');

次に、次と前の投稿リンクを追加できるように、2つのショートコードを設定しました。私が使用しているテーマは何も返されないと(そして最初と最後の投稿はそれぞれ前と次の投稿リンクには何も返さないでしょうが)うまくいかないので、私は空白を返す必要がありました:

function next_shortcode($atts) {
    global $post;
    ob_start(); 
    next_post_link( '<div class="nav-next">%link</div>', 'Next Work <span class="arrow_carrot-right_alt2"></span>' );              
    $result = ob_get_contents();
    ob_end_clean();
    $result = (!$result ? '<div class="nav-next">&nbsp;</div>' : $result);
    return $result;
}

function prev_shortcode($atts) {
    global $post;
    ob_start();
    previous_post_link( '<div class="nav-previous">%link</div>', '<span class="arrow_carrot-left_alt2"></span> Previous Work' );              
    $result = ob_get_contents();
    ob_end_clean();
    $result = (!$result ? '<div class="nav-previous">&nbsp;</div>' : $result);
    return $result;
}
add_shortcode( 'prev_work', 'prev_shortcode' );
add_shortcode( 'next_work', 'next_shortcode' );

Elegant Themesのエレガントなアイコンフォントを使用しているので、arrow_carrot-left/right_alt2クラスの<span>が適しています。

とにかく、これが他の誰かに役立つことを願います!!

6
Will Lanni