উইজেটের শিরোনামের পরে উইজেটের সামগ্রী মোড়ানোর জন্য একটি ডিভি যোগ করা


10

আমি আমার গতিশীল সাইডবারে একটি উইজেটের সামগ্রীতে একটি ডিভি যুক্ত করার চেষ্টা করছি।

নিবন্ধের কোডটি এখানে;

register_sidebar(array(
        'name' => "Sidebar1",
        'id' => 'home-sidebar-1',
        'before_widget' => '<div class="sidebar-box">',
        'after_widget' => '</div>',
        'before_title' => '<div class="title">',
        'after_title' => '</div>',
    ));

কিন্তু এই কোড এর কারণ কারণ;

<div class="sidebar-box">
    <div class="title">{WIDGET TITLE}</div>
     {WIDGET CONTENT}
</div>

এখানে আমি যা করার চেষ্টা করছি;

<div class="sidebar-box">
    <div class="title">{WIDGET TITLE}</div>
    <div class="content">
           {WIDGET CONTENT}
    </div> 
</div>

এটা কিভাবে করা যায়?

উত্তর:


18

টসচোর জবাব ছাড়াও এখানে আপনার দৃ solution় সমাধানের জন্য কী প্রয়োজন:

// if no title then add widget content wrapper to before widget
add_filter( 'dynamic_sidebar_params', 'check_sidebar_params' );
function check_sidebar_params( $params ) {
    global $wp_registered_widgets;

    $settings_getter = $wp_registered_widgets[ $params[0]['widget_id'] ]['callback'][0];
    $settings = $settings_getter->get_settings();
    $settings = $settings[ $params[1]['number'] ];

    if ( $params[0][ 'after_widget' ] == '</div></div>' && isset( $settings[ 'title' ] ) && empty( $settings[ 'title' ] ) )
        $params[0][ 'before_widget' ] .= '<div class="content">';

    return $params;
}

টসচোর উত্তর থেকে:

register_sidebar(array(
    'name' => "Sidebar1",
    'id' => 'home-sidebar-1',
    'before_widget' => '<div class="sidebar-box">',
    'after_widget' => '</div></div>',
    'before_title' => '<div class="title">',
    'after_title' => '</div><div class="content">',
));

এটি যা করে তা হ'ল:

  • 2 ক্লোজিং শেষ হওয়া উইজেট জন্য চেক নিবন্ধিত পার্শ্বদন্ডে জন্য সেটিংস <div>গুলি
  • কোন শিরোনাম আছে কিনা তা পরীক্ষা করে দেখুন
  • যদি তা না হয় তবে before_widgetএটি খোলার উইজেট সামগ্রী ডিভ দেখানোর জন্য আউটপুট পরিবর্তন করে

আপনি এই পদ্ধতির সাহায্যে উইজেটের উদাহরণের সেটিংসের ভিত্তিতে সাইডবার আর্গুমেন্টগুলি অন্য উপায়ে পরিবর্তন করতে পারেন।


এতে আমার একটি সমস্যা রয়েছে: কিছু উইজেট (যেমন ডাব্লুপি ডিফল্ট হিসাবে, উদাহরণস্বরূপ) আপনি যদি খালি ছেড়ে যান তবে একটি ডিফল্ট শিরোনাম সেট করে। সুতরাং আপনার ফাংশনটি ডিভ যুক্ত করে কারণ প্যারামগুলিতে সেই সময়ে কোনও শিরোনাম নেই, তবে উইজেট এটি পরে যুক্ত করে এবং কোডটি গণ্ডগোল করে। আপনি কীভাবে উইজেটের "ভিতরে" থেকে শিরোনামটি চেক করবেন তা জানেন? ধন্যবাদ
Cmorales

না উইজেট চেক বা কিছু horrendously জটিল কোড উইজেট রেন্ডার করতে চুপটি তারপর একটি শিরোনামের জন্য এটি পার্স দ্বারা একটি উইজেট যোগ ছাড়া ... একটি মনে হবে
sanchothefat

এই কোডেক্স.ওয়ার্ডপ্রেস.আর. /ফোকাস_রিফারেন্স / এটি_উইজেটটি কী সহায়তা করবে? তারা এই নিবন্ধটিতে (অন্যান্য কারণে) এটি ব্যবহার করে wp.smashingmagazine.com/2012/12/11/…
Cmorales

1
the_widget()dynamic_sidebar()ফাংশনে ব্যবহৃত হয় না , এটি আপনার নির্দিষ্ট বিকল্পগুলির সাথে কোনও উইজেট কল করার একটি মাধ্যম। এটি ফিল্টার করার জন্য এটি অন্য এক জায়গা যাতে আমার সমাধান সেই ঘটনাকে coverেকে রাখে না। চিয়ার্স
সানচোথফাত

2

divশিরোনাম প্যারামিটারে দ্বিতীয়টি যুক্ত করুন :

register_sidebar(array(
        'name' => "Sidebar1",
        'id' => 'home-sidebar-1',
        'before_widget' => '<div class="sidebar-box">',
        'after_widget' => '</div></div>',
        'before_title' => '<div class="title">',
        'after_title' => '</div><div class="content">',
    ));

কোনও উইজেটের শিরোনাম না থাকলে এটি ব্যর্থ হয় - এটি করা যেতে পারে
sanchothefat

হ্যাঁ এটির ব্যর্থতা নেই যখন কোনও শিরোনাম নেই ..
এমবিআরআইএন

আমি শিরোনাম সমস্যা সমাধানের জন্য কিছু কোড সহ একটি উত্তর যুক্ত করেছি। সম্ভবত টসচোর সত্যিকারের সাথে মিশে যাওয়া উচিত তবে ইতিমধ্যে তাঁর মহাকাব্যিক প্রতিবেদন রয়েছে :)
সানচোথফেট

2

আমি @ টাস্কো এবং @ স্যানসোচোফ্যাট উভয় জবাবের ধারণা পছন্দ করেছি - তবে আমি এই সংমিশ্রণের সাথে লড়াই করেছি কারণ empty( $settings[ 'title' ]সত্যিকার অর্থে উইজেটটি কোনও ডিফল্ট শিরোনাম নির্ধারণ করতে পারে যদি সেট না থাকে। এই শিরোনামটি তারপরে before_titleএবং after_titleমার্কআপে আবৃত হয় এবং আবার পৃষ্ঠাটি ব্রেক হয়। যাইহোক, কিছু ডিফল্ট উইজেটের ক্ষেত্রে এটিই।

স্ট্যান্ডার্ড উইজেট নিবন্ধকরণের পরামিতিগুলিতে কেবল আঁকড়ে থাকা সহজ;

register_sidebar(array(
    'id' => 'sidebar1',
    'name' => __( 'Sidebar 1', 'bonestheme' ),
    'description' => __( 'The first (primary) sidebar.', 'bonestheme' ),
    'before_widget' => '<div class="block">',
    'after_widget' => '</div>',
    'before_title' => '<div class="block-title">',
    'after_title' => '</div>',
));

এবং তারপরে এখানে মার্ভেন্টাসের উত্তর অনুসারে একটি ফিল্টার ক্রিয়া যুক্ত করুন;

http://wordpress.org/support/topic/add-html-wrapper-around-widget-content

function widget_content_wrap($content) {
    $content = '<div class="block-content">'.$content.'</div>';
    return $content;
}
add_filter('widget_text', 'widget_content_wrap');

3
এবং এটি কেবলমাত্র "পাঠ্য উইজেটস"
সিলভার মুন

1

এটি অর্জনের জন্য আপনি যা করেন তা এখানে:

register_sidebar(array(
        'name' => "Sidebar1",
        'id' => 'home-sidebar-1',
        'before_widget' => '<div class="sidebar-box"><div class="content">',
        'after_widget' => '</div></div>',
        'before_title' => '</div><div class="title">',
        'after_title' => '</div><div class="content">',
    ))

যখন কোনও শিরোনাম নেই আপনি পাবেন:

<div class="sidebar-box"><div class="content">
{CONTENT}
</div></div>

যখন কোনও শিরোনাম থাকবে আপনি পাবেন:

<div class="sidebar-box"><div class="content">
</div><div class="title">
{TITLE}
<div class="content">
{CONTENT}
</div></div>

প্রথম খালি কন্টেন্ট-ডিভটি পরবর্তীকালে না দেখায় তা নিশ্চিত করার জন্য আপনি এটি আপনার সিএসএসে যুক্ত করেছেন:

.sidebar-box .content:empty {display:none !important;}

0

পূর্ববর্তী উত্তরগুলি দেখার পরে, আমি মনে করি স্যামোথেলফেটের উত্তর দিয়ে চিহ্নিত সাইমোরালস সমস্যাটি আমি ঠিক করেছি। আপনার উইজেটটি নিম্নরূপে সংজ্ঞায়িত করুন:

register_sidebar( array(
    'name' => 'Sidebar',
    'id' => 'sidebar',
    'before_widget' => '<div class="panel panel-default %2$s" id="%1$s">',
    'after_widget' => '</div>',
    'before_title' => '',
    'after_title' => ''
) );

এটা তোলে গুরুত্বপূর্ণ যে before_titleএবং after_titleঅক্ষমতা সরিয়ে ফেলা হয়। কিছু পরীক্ষা এবং ত্রুটির পরে আমি লক্ষ করেছি যে প্রথম ফিল্টারটি একটি ডিফল্ট শিরোনাম দেখিয়েছিল widget_title। তারপরে widget_titleফিল্টারটি ব্যবহার করুন :

function widget_title( $title ) {
    if ( $title )
        $title = '<div class="panel-heading"><h3 class="panel-title">' . $title . '</h3></div>';
    $title .= '<div class="panel-body">';
    return $title;
}

মূলত, <div class="panel-heading"><h3 class="panel-title">আমার before_titleএবং </h3></div>আমার after_title। অবশেষে, dynamic_sidebar_paramsআমাদের সামগ্রীর মোড়কের জন্য একটি ক্লোজিং ডিভকে পুনরায় ত্যাগ করতে ব্যবহার করুন:

function dynamic_sidebar_params( $params ) {
    $params[0]['after_widget'] = '</div>' . $params[0]['after_widget'];
    return $params;
}

এটি সুন্দর নয়, তবে এটি কার্যকর।


প্রথমদিকে এই পদ্ধতির দ্বারা খুব উত্তেজিত ছিল, তবে আমি উইজেটগুলির সাথে একটি সমস্যার মধ্যে পড়েছিলাম যা এসকে_এইচটিএমএল ($ শিরোনাম) (অর্থাত্‍ বুডিপ্রেস) ব্যবহার করে। যখন এটি হয়, যুক্ত হওয়া এইচটিএমএল প্রদর্শিত হয় এবং পালিয়ে যায় এবং সম্মুখ প্রান্তে রেন্ডার হয় না।
রায়ান

0

আমি কেবল কোডটি সামান্য পরিবর্তন করেছি যাতে রেজিস্টার_সাইডবারটি স্পর্শ করার প্রয়োজন নেই । নিয়মিত উপায়ে একটি সাইডবার নিবন্ধন করুন:

register_sidebar(array(
    'name' => "Sidebar1",
    'id' => 'home-sidebar-1',
    'before_widget' => '<div class="sidebar-box">',
    'after_widget' => '</div>',
    'before_title' => '<div class="title">',
    'after_title' => '</div>',
));

এবং নীচে স্যানচেথফেটের সমাধান থেকে সংশোধিত কোডটি দেওয়া হয়েছে:

/**
 * If no title given then add widget-content wrapper to before_widget
 * If title given then add content wrapper to before_widget
*/
add_filter('dynamic_sidebar_params', 'check_widget_template');
function check_widget_template($params){
    global $wp_registered_widgets;

    $settings_obj = $wp_registered_widgets[$params[0]['widget_id']]['callback'][0];
    $the_settings = $settings_obj->get_settings();
    $the_settings = $the_settings[$params[1]['number']];

    if (isset($params[0]['id']) && $params[0]['id'] == 'home-sidebar-1') {
        if (!isset($the_settings['title']) && empty($the_settings['title'])) {
            $params[0]['before_widget'] .= '<div class="widget-inner">';
            $params[0]['after_widget']  .= '</div>';
        } else {
            $params[0]['after_widget']  .= '</div>';
            $params[0]['after_title']   .= '<div class="widget-inner">';
        }
    }

    return $params;
}

0

মন্তব্যে উল্লিখিত হিসাবে, কিছু মূল উইজেটগুলি তাদের নিজস্ব শিরোনাম যুক্ত করে যা কনটেন্ট ডিভের সাথে দু'বার জড়িয়ে যায়। এগুলি সরাতে, আপনি কেবল একটি খালি স্ট্রিং ফিরিয়ে দিতে পারেন। কেবলমাত্র খারাপ দিকটি হ'ল আপনাকে ম্যানুয়ালি সমস্ত শিরোনাম প্রবেশ করতে হবে।

function remove_default_widget_title( $title, $instance = [], $id = '' ) {
    if ( isset($instance['title']) && trim($instance['title']) == '' ) {
        return '';
    }
    return $title;
};
add_filter( 'widget_title', 'remove_default_widget_title', 10, 3 );

আমি এখানে কিছু অনুপস্থিত থাকলে আমাকে সংশোধন করুন, তবে আমি মনে করি এটি বেশ শক্ত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.