$type,'post_status'=>$status==='all'?['publish','draft','private']:$status,'posts_per_page'=>$per,'paged'=>$paged,'orderby'=>$orderby,'order'=>strtoupper($order)];if($search!=='')$args['s']=$search; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- admin-only, paginated meta filter. if($index_filter==='noindex')$args['meta_query']=['relation'=>'OR',['key'=>MPSEO_Meta::N,'value'=>'1','compare'=>'='],['key'=>MPSEO_Meta::OV,'value'=>'noindex','compare'=>'=']]; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- admin-only, paginated meta filter. elseif($index_filter==='exceptions')$args['meta_query']=[['key'=>MPSEO_Meta::OV,'value'=>['index','noindex'],'compare'=>'IN']]; // phpcs:ignore WordPress.DB.SlowDBQuery.slow_db_query_meta_query -- admin-only, paginated meta filter. elseif($index_filter==='inherit')$args['meta_query']=['relation'=>'OR',['key'=>MPSEO_Meta::OV,'compare'=>'NOT EXISTS'],['key'=>MPSEO_Meta::OV,'value'=>'default','compare'=>'='],['key'=>MPSEO_Meta::OV,'value'=>'','compare'=>'=']]; $args['ignore_sticky_posts']=true;$q=new WP_Query($args); // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- read-only admin view/filter parameters, sanitized and allowlisted; no state change. echo '
';if(isset($_GET['saved'])&&is_string($_GET['saved'])&&sanitize_key(wp_unslash($_GET['saved']))==='1')echo ('

' . esc_html__('SEO changes saved. Your filters and page were kept.', 'multipify-seo-boost') . '

');echo ('

' . esc_html__('Content list', 'multipify-seo-boost') . '

' . esc_html__('Manage and optimize your content for SEO.', 'multipify-seo-boost') . '

'); echo ('
' . esc_html__('Edit multiple items', 'multipify-seo-boost') . '

' . esc_html__('Filter by type, status or indexing, edit the rows you need, then save. Filters and pagination are kept. The score filter only applies to the displayed page.', 'multipify-seo-boost') . '

'); echo '
'; echo '
' . esc_html__('All', 'multipify-seo-boost') . '' . esc_html__('Published', 'multipify-seo-boost') . '' . esc_html__('Drafts', 'multipify-seo-boost') . '
'; echo ('

' . esc_html__('The “Explicit noindex” filter shows directives saved on items and the “Force noindex” exceptions. It does not include content excluded only by a global rule.', 'multipify-seo-boost') . '

'); echo ('

'); echo ('

' . esc_html__('The score is calculated on the fly: this filter only acts on the rows already displayed, without changing pagination or the results of other pages.', 'multipify-seo-boost') . '

'); echo ('

' . esc_html__('The “Allow” exception overrides the content type’s default noindex, but does not remove an explicit noindex checked on the item. Bulk actions only affect the selected rows (200 maximum).', 'multipify-seo-boost') . '

'); echo '
'.wp_kses(wp_nonce_field('mpseo_bulk_save','_wpnonce',true,false),['input'=>['type'=>true,'id'=>true,'name'=>true,'value'=>true]]).'
0 ' . esc_html__('selected', 'multipify-seo-boost') . '
'; foreach($q->posts as $p){$t=get_post_meta($p->ID,MPSEO_Meta::T,true);$d=get_post_meta($p->ID,MPSEO_Meta::D,true);$k=get_post_meta($p->ID,MPSEO_Meta::K,true);$n=get_post_meta($p->ID,MPSEO_Meta::N,true);$ov=get_post_meta($p->ID,MPSEO_Meta::OV,true);if(!in_array($ov,['index','noindex'],true))$ov='default';$score=MPSEO_Meta::score($p,$k,$d,$t?:$p->post_title);$tone=$score>=80?'good':($score>=60?'mid':'bad');echo '';} if(!$q->posts)echo (''); echo '
'.wp_kses_post(MPSEO_V61_UI::sort_link(esc_html__('Content', 'multipify-seo-boost'),'title',$orderby,$order)).'' . esc_html__('SEO title', 'multipify-seo-boost') . '' . esc_html__('Meta description', 'multipify-seo-boost') . '' . esc_html__('Keyword', 'multipify-seo-boost') . '' . esc_html__('Indexing', 'multipify-seo-boost') . '' . esc_html__('Global exception', 'multipify-seo-boost') . '' . esc_html__('SEO score', 'multipify-seo-boost') . '' . esc_html__('Actions', 'multipify-seo-boost') . '
'.esc_html($p->post_title).'' . esc_html__('Edit', 'multipify-seo-boost') . ' · ' . esc_html__('View', 'multipify-seo-boost') . ''.esc_html((string)$score).'/100'.wp_kses_post(MPSEO_V61_UI::actions_menu([['label'=>esc_html__('Edit', 'multipify-seo-boost'),'url'=>get_edit_post_link($p)],['label'=>esc_html__('View', 'multipify-seo-boost'),'url'=>get_permalink($p)]])).'
' . esc_html__('No content found.', 'multipify-seo-boost') . '
';MPSEO_Inline_Assets::script('document.addEventListener("DOMContentLoaded",function(){var f=document.getElementById("mpseo-score-filter"),c=document.getElementById("mpseo-score-count");if(!f)return;function apply(){var rows=document.querySelectorAll("tr[data-mpseo-score]"),shown=0;rows.forEach(function(row){var score=Number(row.getAttribute("data-mpseo-score")),v=f.value,ok=v==="all"||(v==="low"&&score<60)||(v==="medium"&&score>=60&&score<80)||(v==="high"&&score>=80);row.hidden=!ok;if(!ok){var checkbox=row.querySelector("[data-mpseo-select-row]");if(checkbox)checkbox.checked=false;}if(ok)shown++;});if(c)c.textContent=shown+" '.esc_js(__('row(s) shown', 'multipify-seo-boost')).'";var all=document.querySelector("[data-mpseo-select-all]");if(all)all.checked=false;var selected=document.querySelector("[data-mpseo-selected]");if(selected)selected.textContent=document.querySelectorAll("tr[data-mpseo-score]:not([hidden]) [data-mpseo-select-row]:checked").length;}f.addEventListener("change",apply);apply();});');echo '
';submit_button(__('Save changes', 'multipify-seo-boost'),'primary','submit',false);echo '
';MPSEO_V61_UI::pagination($paged,$q->max_num_pages,$q->found_posts,$per,['label'=>__('items', 'multipify-seo-boost')]);echo '
'; } static function save(){ if(!MPSEO_Access::allowed())wp_die(esc_html__('Access denied', 'multipify-seo-boost'));check_admin_referer('mpseo_bulk_save'); $type=isset($_POST['post_type'])&&is_string($_POST['post_type'])?sanitize_key(wp_unslash($_POST['post_type'])):'post';if(!post_type_exists($type)||!is_post_type_viewable($type)||$type==='attachment')$type='post'; if(!empty($_POST['apply_bulk'])){ $selected=isset($_POST['selected'])&&is_array($_POST['selected'])?array_map('absint',wp_unslash($_POST['selected'])):[];$selected=array_slice(array_values(array_filter(array_unique($selected))),0,200);$action=isset($_POST['bulk_action'])&&is_string($_POST['bulk_action'])?sanitize_text_field(wp_unslash($_POST['bulk_action'])):''; $schemas=['Article','WebPage','Product'];foreach($selected as $id){if(!$id||get_post_type($id)!==$type||!current_user_can('edit_post',$id))continue;if($action==='inherit'){update_post_meta($id,MPSEO_Meta::OV,'default');}elseif($action==='index'){update_post_meta($id,MPSEO_Meta::OV,'index');}elseif($action==='noindex'){update_post_meta($id,MPSEO_Meta::OV,'noindex');}elseif(strpos($action,'schema:')===0){$schema=substr($action,7);if(in_array($schema,$schemas,true))update_post_meta($id,MPSEO_Meta::S,$schema);}} }else{ $rows=[];if(isset($_POST['rows'])&&is_array($_POST['rows'])){foreach(array_slice(map_deep(wp_unslash($_POST['rows']),'sanitize_text_field'),0,100,true) as $row_id=>$row){if(!is_array($row))continue;$safe=[];foreach(['title','desc','kw','noindex','override'] as $field){if(isset($row[$field])&&is_string($row[$field]))$safe[$field]=sanitize_text_field($row[$field]);}$rows[$row_id]=$safe;}}foreach($rows as $id=>$r){$id=is_scalar($id)?absint($id):0;if(!$id||get_post_type($id)!==$type||!current_user_can('edit_post',$id)||!is_array($r))continue;foreach($r as $field=>$value){if(!in_array($field,['title','desc','kw','noindex','override'],true)||!is_string($value))unset($r[$field]);else $r[$field]=sanitize_text_field($value);}update_post_meta($id,MPSEO_Meta::T,sanitize_text_field($r['title']??''));update_post_meta($id,MPSEO_Meta::D,sanitize_textarea_field($r['desc']??''));update_post_meta($id,MPSEO_Meta::K,sanitize_text_field($r['kw']??''));update_post_meta($id,MPSEO_Meta::N,!empty($r['noindex'])?'1':'0');$override=isset($r['override'])&&is_string($r['override'])?sanitize_key($r['override']):'default';update_post_meta($id,MPSEO_Meta::OV,in_array($override,['default','index','noindex'],true)?$override:'default');} } $url=admin_url('admin.php?page=mpseo-bulk&ptype='.$type.'&saved=1');$status=isset($_POST['return_status'])&&is_string($_POST['return_status'])?sanitize_key(wp_unslash($_POST['return_status'])):'all';if(in_array($status,['publish','draft','private'],true))$url=add_query_arg('status',$status,$url);$index_filter=isset($_POST['return_index_filter'])&&is_string($_POST['return_index_filter'])?sanitize_key(wp_unslash($_POST['return_index_filter'])):'all';if(in_array($index_filter,['noindex','exceptions','inherit'],true))$url=add_query_arg('index_filter',$index_filter,$url);$search=isset($_POST['return_search'])&&is_string($_POST['return_search'])?sanitize_text_field(wp_unslash($_POST['return_search'])):'';if($search!=='')$url=add_query_arg('s',$search,$url);$paged=min(100000,max(1,absint(isset($_POST['return_paged'])&&is_scalar($_POST['return_paged'])?wp_unslash($_POST['return_paged']):1)));$per=absint(isset($_POST['return_per_page'])&&is_scalar($_POST['return_per_page'])?wp_unslash($_POST['return_per_page']):20);if(!in_array($per,[10,20,50,100],true))$per=20;$orderby=isset($_POST['return_orderby'])&&is_string($_POST['return_orderby'])?sanitize_key(wp_unslash($_POST['return_orderby'])):'modified';if(!in_array($orderby,['modified','date','title'],true))$orderby='modified';$order=isset($_POST['return_order'])&&is_string($_POST['return_order'])?sanitize_key(wp_unslash($_POST['return_order'])):'desc';if(!in_array($order,['asc','desc'],true))$order='desc';$url=add_query_arg(['paged'=>$paged,'per_page'=>$per,'orderby'=>$orderby,'order'=>$order],$url);wp_safe_redirect($url);exit; } }