【发布时间】:2019-11-24 06:46:35
【问题描述】:
我正在尝试创建一个小部件,该小部件接受段落编号并在帖子的指定段落之后插入一些 HTML(用于广告)。例如,如果用户在第一个字段中输入 1,在第二个字段中输入 3,我希望我定义的一些标记出现在这些段落之后。
当我通过
手动创建数组时,我已经创建了小部件并设法使其工作$paragraph_targets = array('1', '3');
在insert_post_ads 方法中。
我坚持的一点是如何从小部件中获取段落编号到 insert_post_ads 方法中。
完整代码如下。
class Ad_Inserter extends WP_Widget
{
public function __construct()
{
parent::__construct(
'ad_inserter',
'Ad Inserter',
[
'description' => 'Inserts ads in post content',
]
);
add_filter('the_content', [
$this,
'insert_post_ads',
]);
}
public function form($instance)
{
$instance = array_merge([
'ad_1' => '',
'ad_2' => '',
], $instance);
?>
<p>
<label for="<?php echo esc_attr($this->get_field_id('ad_1')); ?>">Ad 1 Position</label>
<input type="text" name="<?php echo esc_attr($this->get_field_name('ad_1')); ?>" id="<?php echo esc_attr($this->get_field_name('ad_1')); ?>"
value="<?php echo esc_attr($instance['ad_1']); ?>">
</p>
<p>
<label for="<?php echo esc_attr($this->get_field_id('ad_2')); ?>">Ad 2 Position</label>
<input type="text" name="<?php echo esc_attr($this->get_field_name('ad_2')); ?>" id="<?php echo esc_attr($this->get_field_name('ad_2')); ?>"
value="<?php echo esc_attr($instance['ad_2']); ?>">
</p>
<?php
}
public function widget($args, $instance)
{
}
public function insert_post_ads($content)
{
if (is_single() && !is_admin()) {
$paragraph_targets = [
'1',
'3',
];
sort($paragraph_targets);
return $this->insert_after_paragraph($paragraph_targets, $content);
}
return $content;
}
// Go through paragraphs and insert ads
public function insert_after_paragraph($paragraph_targets, $content)
{
$ad_ids = [
'advert-1',
'advert-2',
];
$closing_p = '</p>';
$paragraphs = explode($closing_p, $content);
foreach ($paragraphs as $index => $paragraph) {
if (trim($paragraph)) {
$paragraphs[$index] .= $closing_p;
}
if ($paragraph_targets[0] == $index + 1) {
$ad_code = '<div id="'.$ad_ids[0].'" class="advert">**** AD ****</div>';
$paragraphs[$index] .= $ad_code;
array_shift($paragraph_targets);
array_shift($ad_ids);
}
}
return implode('', $paragraphs);
}
}
add_action('widgets_init', 'registerWidget');
function registerWidget()
{
register_widget('Ad_Inserter');
}
【问题讨论】: