Wordpress - 如何获取小部件实例的信息?

问题描述 投票:0回答:1

我想知道如何获取一个小部件实例的信息,以便能够从另一个小部件中获取其所有信息。我尝试了获取Widget ID插件,但它的结果是 "temp",我也尝试了这个代码块。

https:/wordpress.stackexchange.comquestions240327如何从外部获取widget数据的问题

但我还是得到同样的结果。

我的想法是这样的。

我正在修改一个Wordpress小部件,使其选择一个静态的帖子,以实现数字报纸中的特色帖子的功能... ... 这个小部件已经被修改过了,并且已经在工作了。同样的小部件在我的网站上的几个地方重复使用,也就是说,我多次使用它(每一次都有不同的选帖)。

我的想法是用该小部件显示特色文章(编辑选择的文章),并修改另一个小部件,显示所有的文章,除了那些在这些小部件中选择的文章。为此,我想知道如何获得选择特色文章的小组件的实例,以便能够在每个小组件中获得所选文章的ID,并显示所有文章,除了那些已经成为特色文章的文章。

总之... 我只是不想再看到被选为专题的新闻。

澄清。这不是我写的小部件,是我买的一个模板,因为它没有这个功能,所以我试图创建它。

我留下我的widget的代码,以备不时之需。

<?php
if ( ! defined( 'ABSPATH' ) ) exit;
add_action('widgets_init', 'seleccion_subtitulo');

function seleccion_subtitulo() {
    register_widget('seleccion_subtitulo');
}

class seleccion_subtitulo extends WP_Widget {

/*-----------------------------------------------------------------------------------*/
/*  Widget Setup
/*-----------------------------------------------------------------------------------*/

    public function __construct() {
        $widget_ops = array(
            'classname' => 'seleccion_subtitulo',
            'description' => esc_html__('Seleccionar noticia con titulo y subtitulo', 'disto')
        );
        parent::__construct('seleccion_subtitulo', esc_html__('Noticias: Noticia titulo + subtitulo [Estilo 1]', 'disto'), $widget_ops);
    }

/*-----------------------------------------------------------------------------------*/
/*  Display Widget
/*-----------------------------------------------------------------------------------*/

function widget($args, $instance) {
    extract($args);

    $featured_post = isset($instance["featured_post"]) ? $instance["featured_post"] : '';
    $posts = null;
    $args =  array(
    'p'                => $featured_post,
    'posts_per_page'   => 1,
    'orderby'          => 'date',
    'order'            => 'DESC',
    'post_type'        => 'post',
    'post_status'      => 'publish',
    'ignore_sticky_posts' => true
    );

    $posts_query = new WP_Query;
    $posts = $posts_query->query($args);
    $unique_block_id = rand(10000, 900000);

    echo '<div class="jl_large_builder jl_nonav_margin jelly_homepage_builder jl-post-block-'.esc_html($unique_block_id).'">';
    if (!empty($instance['titles'])) {?>
<div class="homepage_builder_title">
    <h2 class="builder_title_home_page">
        <?php echo esc_attr($instance["titles"]);?>
    </h2>
</div>
<?php }?>
<?php
    while ($posts_query->have_posts()) {
       $post_id = get_the_ID();
       $posts_query->the_post();
       $categories = get_the_category(get_the_ID());
    ?>
<div class="jl_post_title_top jl_large_format">       
    <h3 class="image-post-title"><a href="<?php the_permalink(); ?>">
            <?php the_title()?></a></h3>
</div>
<div class="post-entry-content">
    <div class="post-entry-content-wrapper">
        <div class="large_post_content">
            <p>
               <?php echo wp_trim_words( get_the_content(), 34, '...' );?>
            </p>
            <!-- <div class="jl_large_sw">
             <a href="<?php the_permalink();?>" class="jl_large_more"><?php echo esc_html__('Read More', 'disto')?></a>             
            <?php if(function_exists('disto_share_footer_link')){echo disto_share_footer_link(get_the_ID());}?>
            </div> -->
        </div>
    </div>
</div>
<div class="box jl_grid_layout1 blog_large_post_style">
<?php if ( has_post_thumbnail()) {?>
<div class="jl_front_l_w">
<?php $slider_large_thumb_id = get_post_thumbnail_id();
    $slider_large_image_header = wp_get_attachment_image_src( $slider_large_thumb_id, 'disto_slider_grid_large', true ); ?>
    <?php if($slider_large_thumb_id){?>
    <span class="image_grid_header_absolute" style="background-image: url('<?php echo esc_url($slider_large_image_header[0]); ?>')"></span>
    <?php }else{?>
    <span class="image_grid_header_absolute"></span>
    <?php }?>
    <a href="<?php the_permalink(); ?>" class="link_grid_header_absolute" title="<?php the_title_attribute(); ?>"></a>
 <?php if(get_theme_mod('disable_post_category') !=1){
      $categories = get_the_category(get_the_ID());          
      if ($categories) {
        echo '<span class="meta-category-small">';
        foreach( $categories as $tag) {
          $tag_link = get_category_link($tag->term_id);
          $title_bg_Color = get_term_meta($tag->term_id, "category_color_options", true);
          $title_reactions = get_term_meta($tag->term_id, "disto_cat_reactions", true);
         if($title_reactions){}else{echo '<a class="post-category-color-text" style="background:'.$title_bg_Color.'" href="'.esc_url($tag_link).'">'.$tag->name.'</a>';}
        }echo "</span>";}}?>
<?php echo disto_post_type();?> 
</div>
<?php }?>
<div class="jl_post_title_top jl_large_format">       
    <?php echo disto_single_post_meta(get_the_ID()); ?>
</div>
</div>
<?php }
        if($post_loadmore == 1){echo '<div class="jl-loadmore-btn-w"><a href="#" class="jl_btn_load">'.esc_html__('Load more', 'disto').'</a></div>';
        wp_add_inline_script( 'disto-custom', "(function($){ $(document).ready(function() {'use strict'; var current_page_".esc_js($unique_block_id)." = 1; $('.jl-post-block-".esc_js($unique_block_id)." .jl_btn_load').click(function(e){ e.preventDefault(); e.stopPropagation(); var button = $(this), data = {'action': 'jl_post_more','query': ".json_encode( $posts_query->query_vars , true).",'page' : current_page_".esc_js($unique_block_id).",'cat' : '".esc_js($cats)."','jl_layout' : 'postslarge'}; var button_default_text = button.text(); $.ajax({ url : '".esc_url(site_url())."/wp-admin/admin-ajax.php', data : data, type : 'POST', beforeSend : function ( xhr ) {button.text('');button.addClass('btn-loading'); }, success : function( data ){ if( data ) { button.text( button_default_text ); button.removeClass('btn-loading'); $('.jl-post-block-".esc_js($unique_block_id)." .jl-loadmore-btn-w').before(data); current_page_".esc_js($unique_block_id)."++; if ( current_page_".esc_js($unique_block_id)." == ".esc_js($posts_query->max_num_pages)." ) button.remove(); }else {button.remove();}}});});});})(jQuery);");
        }
        wp_reset_postdata();
?>
</div>
<?php }
/*-----------------------------------------------------------------------------------*/
/*  Update Widget
/*-----------------------------------------------------------------------------------*/

function update( $new_instance, $old_instance ) {
    $instance = $old_instance;
    $instance['featured_post'] = $new_instance['featured_post'];
    return $instance;
}

/*-----------------------------------------------------------------------------------*/
/*  Widget Settings (Displays the widget settings controls on the widget panel)
/*-----------------------------------------------------------------------------------*/

function form( $instance ) {?>

<h2>Elige una de las ultimas 20 noticias para establecerla como portada secundaria.</h2>
<div class="container">
    <p>
        <label>
            <strong> <?php esc_html_e('Seleccionar noticia destacada:', 'disto');?></strong>
        </label>
    </p>
    <p>    
        <select id="<?php echo esc_attr( $this->get_field_id( 'featured_post' ) ); ?>" name="<?php echo esc_attr( $this->get_field_name( 'featured_post' ) ); ?>">

            <?php 
                $posts_args = array('posts_per_page' => 20,
                'orderby'          => 'date',
                'order'            => 'DESC',
                'post_type'        => 'post',
                'post_status'      => 'publish',
                'ignore_sticky_posts' => true);


                $last_entries = get_posts($posts_args);
                foreach ($last_entries as $entry) {
            ?>
                <option value="<?php echo $entry->ID; ?>" <?php if($instance['featured_post']==$entry->ID){ echo 'selected="selected"'; } ?> ><?php echo $entry->post_title; ?></option>
            <?php
                }
            ?>
        </select>
    </p>
</div>

<?php
    }
}
?>

如果我做var_dump ($instance),会显示以下内容。

array(3) { ["featured_post"]=> string(4) "2970" ["so_sidebar_emulator_id"]=> string(29) "seleccion_subtitulo-421210000" ["option_name"]=> string(26) "widget_seleccion_subtitulo" }

我估计下面的值是我的小组件的ID:

["so_sidebar_emulator_id"] => string (29) "seleccion_subtitulo-421210000"

但我不知道如何从另一个小组件中调用它来获取信息。


当获取该信息时,我尝试下面的代码,看看我得到了什么(我在先发生的链接中看到这个代码)。

$widget_name = 'seleccion_subtitulo';
$widget_instance = '421210000';
$widget_instances = get_option('widget_' . $widget_name);
$data = $widget_instances[$widget_instance];
var_dump($widget_instances);

如果我这样做 var_dump($data)。 我得到的是 NULL

如果我这样做 var_dump($widget_instances)。 我得到了。

array(1) { ["_multiwidget"]=> int(1) }
php wordpress widget instance
1个回答
0
投票

让我们把你的问题改写成两部分。

  1. "如何获得一个小部件的设置"
  2. "如何获得该小组件所使用的特色帖子列表,以便将其从另一个帖子列表中排除"。

1. 小工具设置。小工具设置存储在数据库中的wp_options表中。 如果你在phpmyadmin中使用widget%通配符在选项名中进行搜索,你会看到所有的widget和它们的序列化数据数组。

你可能会注意到他们都有一个叫做"_multiwidget "的子数组,它将包含实例和他们的设置。在您上面的例子中,您转储了这个 ["_multiwidget"]=> int(1)

这表明 一无所获 为该小组件。 小工具不在侧栏中,也没有为该小工具定义特色文章。

如果该小组件已被保存到侧边栏并进行了一些设置,我们将在这里看到更多细节。

设置一些小组件实例,这样你就可以看到保存的数据结构。 然后你就可以看到小组件的细节了(通过phpmyadmin或者像之前一样通过转储)

2. 从一组小组件实例中获取特色文章列表,以便从查询中排除它们(在另一个小组件中)。

对于你正在看的小部件,我们可能会看到一个设置数组,其中一个叫做 "feature_post"。

一旦widget被拖到一些侧边栏,并在一些实例中定义了一些特色文章,你就可以在你的新widget中做一些类似(伪代码)的事情。

$widget_name = 'seleccion_subtitulo'; //if that's the widget name in the db.
$widget_settings = get_option('widget_' . $widget_name);
$featured_posts = array();
if (!empty($widget_settings)) {
    if (!empty($widget_settings["_multiwidget"])) {
        $instances = $widget_settings["_multiwidget"];
        foreach ( $instances as $wid =>  $instance) {
            $featured_posts[] = $instance['featured_post']; // if that is how it is stored in the widget details
        }
    }
}

然后你可以使用 https:/developer.wordpress.orgreferencefunctionsget_posts。 并在参数数组中传递数组$featured_posts作为

'exclude' => $featured_posts 

请注意,对于你说要实现的目标,不需要知道 "实例 "或 "widget id",只需要循环浏览该widget的所有实例即可。

© www.soinside.com 2019 - 2024. All rights reserved.