这里是对@PieterGoosen的答案的补充。
有几种方法可以修改WP_Query
, 这在一个短代码中。让我们假设[recent_posts]
.
Method A) 如果短代码使用shortcode_atts()
(正如@PieterGoosen提到的)例如wpse
, 然后:
/**
* Method A: Using the shortcode_atts_$shortcode filter + pre_get_posts action
*/
add_filter( \'shortcode_atts_wpse\', function ( $out, $pairs, $atts )
{
if( isset( $atts[\'post_type\'] ) && $post_type = $atts[\'post_type\'] )
{
add_action( \'pre_get_posts\', function ( $q ) use ( $post_type )
{
static $activated = false;
if( ! $activated )
{
$q->set( \'post_type\', santize_key( $post_type ) );
$activated = true;
}
}
}
return $out;
} );
Here 你可以看到我关于如何使用这个过滤器的另一个答案。
Method B) 否则,我们可以用一个新的回调重新注册短代码。
将其更改为old_recent_posts
到new_recent_posts
:
/**
* Method B: Re-register the shortcode
*/
add_action( \'after_setup_theme\', function()
{
if( function_exists( \'old_recent_posts\' ) )
{
remove_shortcode( \'recent_posts\', \'old_recent_posts\' );
add_shortcode( \'recent_posts\', \'new_recent_posts\' );
}
} );
function new_recent_posts( $atts = [], $content = \'\' )
{
if( isset( $atts[\'post_type\'] ) && $post_type = $atts[\'post_type\'] )
{
add_action( \'pre_get_posts\', function ( $q ) use ( $post_type )
{
static $activated = false;
if( ! $activated )
{
$q->set( \'post_type\', santize_key( $post_type ) );
$activated = true;
}
}
}
return old_recent_posts( $atts = [], $content = \'\' );
}
Here 您可以看到@toscho如何替换短代码回调,问题与我上面的链接答案相同。
请注意,我没有对此进行测试,但希望您可以根据自己的需要进行调整。