检查CTP类别分类是否设置为短码

时间:2016-03-17 作者:rikardo85

我创建了一个自定义的帖子类型,可以添加类别(分类法)。

分类学

function create_cat_tax() {
        register_taxonomy(
        \'cpt_cats\',
        \'cpt_faqs\',
        array(
            \'labels\' => array(
            \'name\' => \'FAQ Categories\',
            \'add_new_item\' => \'Add New FAQ category\',
            ),
            \'show_ui\' => true,
            \'show_tagcloud\' => false,
            \'hierarchical\' => true
        )
        );
}
add_action( \'init\', \'create_cat_tax\', 0 );
我还创建了使用快捷码添加所有自定义帖子类型内容的功能。

短代码:

function cpt_sc($atts) {

extract(shortcode_atts( array(
  \'posts\' => -1,
  \'order\' => \'\',
  \'orderby\' => \'\',
  \'title\' => \'\',
  \'id\' => \'\',
  \'category\' => \'\'
), $atts ) );

$args = array(
  \'posts_per_page\' => $posts,
      \'order\' => $order,
      \'orderby\' => $orderby,
      \'post_type\' => \'cpt_faqs\',
      \'p\' => $id,
      \'cpt_cats\' => $category
    ); 

}
add_shortcode( \'faqs\', \'cpt_sc\' );
如何查询以查看是否在快捷码中设置了类别?

e、 g级[faqs category="category one"]

之前,我使用了下面的,工作没有问题。

if ( \'true\' == $atts[\'accordion\'] )
{
    ob_start();
    echo \'content here\';
    return ob_get_clean();
}
else
{
    ob_start();
    echo \'other content here\';
    return ob_get_clean();
}
非常感谢您的帮助。

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

正如评论中所说,do not ever use extract(). 它的用途在几年前从核心中移除。抄本也被清理了。使用extract() 甚至不鼓励使用PHP。您可以按如下方式重写属性:(NOTE: 需要PHP 5.4+)

$attributes = shortcode_atts( 
    [
        \'posts\'    => -1,
        \'order\'    => \'\',
        \'orderby\'  => \'\',
        \'title\'    => \'\',
        \'id\'       => \'\',
        \'category\' => \'\'
    ],
    $atts 
);
要访问属性,可以使用以下语法(,这是常规数组语法)

$attribute[\'category\']
如果你想利用\'taxonomy\' => \'term\' 语法,您需要确保您的术语通过了一个slug。还有,当你register your taxonomy, 您需要确保query_var 参数保留为默认值。我宁愿建议使用适当的tax_query 哪个更灵活。

在下面的示例中,我设置了field 设置为的属性slug 默认情况下。这意味着category 可以是字符串或段塞数组。如果需要将术语ID作为整数、字符串或数组传递,可以只传递term_id 作为对的值field 属性

add_shortcode( \'faqs\', \'cpt_sc\' );
function cpt_sc($atts) {

    $attributes = shortcode_atts( 
        [
            \'posts\'    => -1,
            \'order\'    => \'\',
            \'orderby\'  => \'\',
            \'title\'    => \'\',
            \'id\'       => \'\',
            \'category\' => \'\'
            \'field\'    => \'slug\'
        ],
        $atts 
    );

    // Set up your variables
    $posts    = $attribute[\'posts\'];
    $order    = $attribute[\'order\'];
    $orderby  = $attribute[\'orderby\'];
    $id       = $attribute[\'id\'];
    $category = $attribute[\'category\'];
    $field    = $attribute[\'field\'];

    $args = [
        \'post_type\'      => \'cpt_faqs\',
        \'posts_per_page\' => $posts,
        \'order\'          => $order,
        \'orderby\'        => $orderby,
        \'p\'              => $id,
        \'tax_query\'      => [
            [
                \'taxonomy\' => \'cpt_cats\',
                \'field\'    => $field,
                \'terms\'    => $category
            ]
        ]
    ]; 

    // Rest of your shortcode

}
这段代码至少需要PHP 5.4。但是,为了安全起见,您应该已经使用PHP 5.6了

要使代码更具动态性,您可以始终为帖子类型和分类设置属性

建议始终能够根据预期的数据类型对任何用户传递的数据进行转义、清理和/或验证。因为您将所有属性直接传递给WP_Query, 如果未按以下方式进行清理/转义/验证,则应保存WP_Query 将在执行SQL查询之前处理该问题。尽管如此,这还是很好的,建议您始终逃避、消毒和/或验证

我实际上忘记了如何检查一个术语是否通过的句柄。您可以检查是否传递了一个术语,如果该值为空,您只需退出或返回一条错误消息

使用属性检查

if ( \'\' == $attribute[\'category\'] )
    return;
设置变量时进行检查

if ( \'\' == $category )
    return;
编辑-来自注释如果短代码中未指定类别,则不会返回任何结果。如果没有设置类别,如何使所有帖子返回?

我们可以通过有条件地添加tax_query. 如果通过了一个术语,则添加tax_query, 否则,不要附加tax_query

我们可以尝试以下方法

$args = [
    \'post_type\'      => \'cpt_faqs\',
    \'posts_per_page\' => $posts,
    \'order\'          => $order,
    \'orderby\'        => $orderby,
    \'p\'              => $id,
];

if ( $category ) {
    $args[\'tax_query\'] = [
        [
            \'taxonomy\' => \'cpt_cats\',
            \'field\'    => $field,
            \'terms\'    => $category
        ]
    ];
}

相关推荐

浏览器刷新时删除数据库条目,AJAX PHP jQuery

我有一个表单,在通过ajax提交表单时更新数据库表中的列。一切都很好,数据库表列可以获取信息,但一旦刷新浏览器,信息就会从数据库中删除。如果meta\\u值不存在,但meta\\u值也在提交表单时创建的数据库中,则PHP将执行数据库更新。我希望信息保留在数据库中,直到或除非meta\\u值被删除或不存在。任何见解都将不胜感激。PHPadd_action(\'wp_ajax_hide_this\', \'hide_this_by_id\'); add_action(\'wp_ajax_nopriv_