我习惯于使用主题挂钩,定期添加功能,但难以使用插件挂钩来过滤内容。这是我所知的极限,我试图理解这个过程,但没有用。
我正在使用GigPress 管理事件。它允许您添加一个节目(基于日期),并将该节目与帖子(标准WP帖子)关联。
我已经创建了一个自定义的帖子类型—productions—来关联节目,而不仅仅是一般的博客帖子。
插件有一个钩子-gigpress_related_post_types
—允许您用自己选择的任何CPT交换帖子。
如果我直接编辑插件,它就会工作,将“帖子”替换为“产品”。如果我添加了我希望是正确的函数,它不会破坏任何东西,而是可以选择所有帖子和帖子类型。建议我重写默认行为,但错误地调用我的函数?
示例插件代码:
<?php
$related_posts_sql = "SELECT p.ID, p.post_title FROM " . $wpdb->prefix . "posts p WHERE (p.post_status = \'publish\' OR p.post_status = \'future\')";
/**
* Provides an opportunity to specify other post types as related posts
*
* @param array $related_post_types
*
* @since 2.3.19
*/
$related_post_types = apply_filters(\'gigpress_related_post_types\', [\'post\']);
if (!empty($related_post_types)) {
$related_posts_sql .= "AND p.post_type IN( \'" . implode("\',\'", $related_post_types) . "\' )";
}
$related_posts_sql .= " ORDER BY p.post_date DESC LIMIT 500";
$entries = $wpdb->get_results($related_posts_sql, ARRAY_A);
if ($entries != FALSE) {
foreach ($entries as $entry) { ?>
<option
value="<?php echo $entry[\'ID\']; ?>"<?php if (isset($show_related) && $entry[\'ID\'] == $show_related) {
echo(\' selected="selected"\');
$found_related = TRUE;
} ?>><?php echo gigpress_db_out($entry[\'post_title\']); ?></option>
<?php }
}
完整插件新显示文件:
https://codeshare.io/50MKJg我所建议的众多函数之一的一个示例是:
add_filter( \'gigpress_related_post_types\', array( \'productions\' ) ); if ( ! empty( $related_post_types ) ) { $related_posts_sql .= "AND p.post_type IN( \'" . implode( "\',\'", $related_post_types ) . "\' )"; }
理想情况下,我还想提供两个CPT来代替“post”-“productions”和“projects”。
最合适的回答,由SO网友:MikeNGarrett 整理而成
你在正确的道路上add_filter
, 但这是实现过滤器的正确方法。
add_filter( \'gigpress_related_post_types\', \'my_related_post_types\' );
function my_related_post_types( $post_types ) {
return array( \'productions\' );
}
钩子
add_filter
必须调用返回要传递给
apply_filters
在您引用的代码中。
您应该添加任何需要的逻辑来返回正确的post类型,并处理默认的post类型。例如:
add_filter( \'gigpress_related_post_types\', \'my_related_post_types\' );
function my_related_post_types( $post_types ) {
// Assuming you set an option to control which post types should be used.
$custom_gig_post_types = get_option( \'gig_post_types\', false );
if ( $custom_gig_post_types ) {
return $custom_gig_post_types;
}
return $post_types;
}