1

基本的にカスタム投稿タイプを返すためだけのカスタムショートコードを作成しています。これが私のコードです:

function shortcode_slider($atts, $content=null){  
    extract(shortcode_atts( array('id' => ''), $atts));  
    $return = $content;
    $return .= query_posts( array( 'post_status' => 'publish' , 'post_type' => 'slider'  ) );
    return $return;  
}  
add_shortcode('slider', 'shortcode_slider');

ショートコードは、1 つのことを除けば問題なく動作します。すべての投稿を返すと、リストの一番上に「配列」も返されます。なぜこれが起こるのでしょうか?

また、「id」入力を使用してカテゴリを指定できるようにしたいと考えています。

 $return .= query_posts( array( 'post_status' => 'publish' , 'post_type' => 'slider', 'category' => $id  ) );

しかし、これの正しい構文がわかりません。

どんな助けでも大歓迎です。

4

3 に答える 3

2

まず第一に、を使用しない query_postsでください。
チェックしてください:

ショートコードの場合、私はget_posts。それはあなたが必要とするものを返し、ループを台無しにすることはありません。

作業を行うことで、属性を実際に抽出する必要がないことに注意してください$atts['id']

動作するショートコードに従います。コメントを参照してください。

add_shortcode( 'slider', 'shortcode_slider' );

function shortcode_slider( $atts, $content=null )
{  
    // Initialize variable and check for shortcode content
    $return = '';
    if( $content ) {
        $return = $content;
    }

    // Shortcode attribute: title="Lorem Ipsum"
    if( isset( $atts['title'] ) ) 
    {
        $return .= '<br><h2>' . $atts['title'] . '</h2>';
    }

    // Get our custom posts
    // 'category' is the category ID or a comma separated list of ID numbers
    $sliders = get_posts( array( 
        'post_status' => 'publish', 
        'post_type' => 'slider',
        'numberposts' => 10, 
        'order'=> 'ASC', 
        'orderby' => 'title',
        'category' => $atts['id']  
    ) );


    // Auxiliary variable, don't print <br> in the first element
    $first = '';

    // Iterate through the resulting array
    // and build the final output
    // Use $slide->post_author, ->post_excerpt, as usual
    //   $slide->ID can be used to call auxiliary functions 
    //   such as get_children or get_permalink
    foreach( $sliders as $slide ) 
    {
        $link = get_permalink( $slide->ID );
        $return .= 
            $first
            . '<a href="' . $link . '">'
            . $slide->post_title 
            . '</a>
        ';
        $first = '<br>';
    }

    return $return;  
}  

デフォルトの投稿タイプで適用されるショートコード:

ショートコード

カスタム投稿タイプ:

cpt

結果:

cptショートコードの結果

便利なリンク:

于 2012-12-20T18:33:27.923 に答える
0

配列を出力する理由はここにあります:

$return .= query_posts( ...

まず、$returnコンテンツ文字列を設定します。次に、返された配列を追加しますquery_posts()。「配列から文字列への変換」エラーが発生しないことに少し驚いていますが、おそらくそれらを抑制しています。

WordPressの自動エコーショートコードなので、何でもreturnエコーアウトします。ショートコードを使用して投稿を取得することは、おそらく最善のアイデアではありません。ショートコードは文字列を返す必要があります。

何を達成しようとしているのかがはっきりしないため、この答えは不完全だと感じます。query_postsループを変更することを目的としていますが、ショートコードが実行されるまでに、すでにループに入っています。

于 2012-12-20T15:39:36.687 に答える
0

最初に$contentを使用しているため、「配列」が含まれているようです。確かに、このショートコードをどのように書いているかを投稿する必要がありますが、これが一般的な考え方です。おそらく次の行は必要ありません。

$return = $content;

ショートコード構文が[slider]some text[/slider]、の場合、上記の行は問題ありません。

2番目の部分については、コードで$atts['id']を使用してIDを取得します。ショートコードは次のようになります。

[slider id="5"]
于 2012-12-17T15:41:18.167 に答える