0
votes

I wanted to know how to get the information of a widget instance, to be able to get all its information from another widget. Try the Get Widget ID plugin but it returns "temp" as a result and I also tried with this code block:

https://wordpress.stackexchange.com/questions/240327/how-to-access-widget-data-from-outside-widget

But I still get the same result.

My idea is the following:

I am modifying a Wordpress widget so that it selects a static post in order to fulfill the function of a featured post in a digital newspaper ... The widget has already been modified and is already working. That same widget is repeated in several places on my website, that is, I use it several times (each with a different selected post).

My idea is to show the featured posts with that widget (those selected by the editor) and modify another widget, that shows me all the posts except the ones that are selected in those widgets. For that I want to know how to get the instance of said widgets that select the featured post, to be able to get the ID of the selected post in each widget and show all the posts except those that are already as featured posts.

In summary ... I just want to see no news that is selected as featured again.

Clarification: This is not a widget written by me, it is a template that I bought and since it did not have this functionality, I am trying to create it.

I leave the code of my widget, in case it is of any use:

<?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
    }
}
?>

If I do var_dump ($instance) it shows me the following:

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

I estimate that the following value tells me the ID of my widget instance:

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

but I don't know how to invoke it from another widget, to get the information from it.


When obtaining that information, I try the following code to see what I get (I saw this code in the link that happens first):

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

If I do var_dump($data); I get NULL

If I do var_dump($widget_instances); I get:

array(1) { ["_multiwidget"]=> int(1) }
1
Hi Joaquin, It sounds like you want code written for you, which is not what stack is about. See: stackoverflow.com/help/on-topic. I suggest showing the code you have so far, try with debug output at each step so you can see where you might already be going wrong, do you have the correct widget name etc, has it fetched what is in the db, is the widget actually in the db?? what structure does the data have? Once you have the data structure of the widgets data, you can extract the post ids to an array. Then you can do a query excluding those post ids. - anmari
@anmari Hello, it is not my intention that the code is written by me ... I am just asking if there is a method to get the ID of a widget instance in use ... I estimate that it is something general of Wordpress, that's why I ask it. Now I edit the post and show the code of the widget I am using, but I think it is irrelevant, because I am not interested in the widget itself, but how to get its data from another widget ... that's why I ask about the instance, once I get the instance I have the data of the widget that I consult. - JoaquinVilchez

1 Answers

0
votes

Lets rephrase your question into 2 parts:

  1. "How to get a widgets settings"
  2. "How to get the list of featured posts as used by that widget for purpose of excluding them from another list of posts"

1. Widget settings: Widget settings are stored in the database in the wp_options table. If you do a search in phpmyadmin using widget% wildcard in the option name field you will see all widgets and their serialised data arrays.

You may note that they all have a subarray called "_multiwidget" which will contain the instances and their settings. In your example above you dumped this ["_multiwidget"]=> int(1)

This shows that nothing has yet been stored for that widget. The widget is not in a sidebar and/or no featured posts have been defined for that widget.

If the widget had been saved to a sidebar with some settings we would be seeing more details here.

Setup some widget instances so you can see the saved data structures. Then you will be able to see the widget details (either via phpmyadmin or by dumping as before)

2. Get list of featured posts out of a set of widget instances in order to exclude them from a query (in another widget)

For the widget you looking at we would probably see an array of settings one of which would be called "featured_post".

Once the widget has been dragged to some sidebars and has some featured posts defined in a few instances, you can then in your new widget do something like (pseudo code):

$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
        }
    }
}

You can then use https://developer.wordpress.org/reference/functions/get_posts/ and pass the array $featured_posts in the argument array as

'exclude' => $featured_posts 

Note that It is not necessary to know the 'instance' or the 'widget id' for what you say to want to achieve, one simply has to loop through all the instances for that widget.