Najbezbolniji način za migrirati WP sa php5 na php7+

Pozdrav,

naslov teme sve kaže.

Probao sam samo prešaltati verziju PHP-a na 7.4 i iskočile su sljedeća upozorenja/greške:

1. Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in some_script.php on line 497 

2. Warning: Parameter 2 to qtranxf_postsFilter() expected to be a reference, value given in some_script.php on line 286

3. Warning: Use of undefined constant replace_meta_widget - assumed 'replace_meta_widget' (this will throw an Error in a future version of PHP) in some_script on line 21

4.  Fatal error: Uncaught Error: Call to undefined function split() in some_script.php on line 154

Upozorenja 1 & 2 su se pojavila gotovo na svim WP site-ovima, dok greška 3&4 se pojavila samo na jednom siteu.

Nekako mi se greške/upozorenja ne čine strašnima, pa se pitam jel se bolje baviti samo tim greškama…ili slijediti neku proceduru za kompletnu migraciju WP na novi PHP. Kako bi išla ta procedura?

Hvala.

Wordpress je kompatibilan sa PHP 7+. Ovo ti je do pluginova ili teme.

1 Like

Najbezbolnije je da uradiš to u localhost-u (il’ na dev/test serveru) prije nego zaključiš da je bolno.

Stavi ovo

ini_set('display_errors','Off');
ini_set('error_reporting', E_ALL );
define('WP_DEBUG', false);
define('WP_DEBUG_DISPLAY', false);

u wp-config.php prije linije /* That’s all, stop editing! Happy publishing. */ da skloniš tu poruku.

Koji fajl je to some_script.php, wp-includes/* pa šta onda, koji plugin, šta?
Daj naziv/lokaciju fajla i blok koda 20-30 linija oko te 497 linije.

Ja sam na PHP verziju 7.4.* prebacio još ljetos i sve je iz prve bilo ok, mislim da ti je sve do teme ili pluginova

Pripremite se odma i za verziju 8.

Što se tiče prve greške:

1. Warning: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"? in some_script.php on line 497

Code je sljedeći, switch statement:

function qtranxf_translate_post($post,$lang) {
	
	
	foreach(get_object_vars($post) as $key => $txt) {
		switch($key){//the quickest way to proceed
			//known to skip
			case 'ID'://int
			case 'post_author':
			case 'post_date':
			case 'post_date_gmt':
			case 'post_status':
			case 'comment_status':
			case 'ping_status':
			case 'post_password':
			case 'post_name': //slug!
			case 'to_ping':
			case 'pinged':
			case 'post_modified':
			case 'post_modified_gmt':
			case 'post_parent': //int
			case 'guid':
			case 'menu_order': //int
			case 'post_type':
			case 'post_mime_type':
			case 'comment_count':
			case 'filter':
				continue;
			//known to translate
			case 'post_content': $post->$key = qtranxf_use_language($lang, $txt, true); break;
			case 'post_title':
			case 'post_excerpt':
			case 'post_content_filtered'://not sure how this is in use
			{
				$blocks = qtranxf_get_language_blocks($txt);
				if(count($blocks)>1){//value is multilingual
					$key_ml = $key.'_ml';
					$post->$key_ml = $txt;
					$langs = array();
					$content = qtranxf_split_blocks($blocks,$langs);
					$post->$key = qtranxf_use_content($lang, $content, $langs, false);
					//$post->$key = qtranxf_use_block($lang, $blocks, false);
					$key_langs = $key.'_langs';
					$post->$key_langs = $langs;
				}
			} break;
			//other maybe, if it is a string, most likely it never comes here
			default:
				$post->$key = qtranxf_use($lang, $txt, false);
		}
	}
}

Ispada da je to samo warning da se “continue” ponaša kao “break”. Taj warning dolazi u php7+, nije bio u php5.

Mene zanima jel se taj code možda drugačije ponašao u php5, ali koliko sam ja uspio čačkati, “continue” & “break” se isto ponašaju u switch statementu i u php5-ici.

Jesam li što previdio, nisam siguran …ali čini mi se da taj continue je isti vrag ko i break i za php5 i za php7+.

Ima to dokumentovano.

Stavi continue 2 i vidi šta će biti.

Izolirao sam switch da testiram… stavio continue 2 i bio je fatal error. A u orginalnom codu nije bio fatal error … palo mi kasnije na pamet da “continue 2” moze biti samo ako je switch unutar loopa… da je tako nesto u igri … s moba sam sad, probam kasnije…

Pa continue 2; dohvata spoljašnju foreach petlju. Zato i 2. Dokumentacija.

Nemoj da izoluješ već probaj kako sam ti ostavio.

1 Like

Ok, istražio sam situaciju.
Kaže da se switch statementi:

  • continue;
  • break;
  • continue 2

…ponašaju identično i u php5 i u php7+. Samo što php7+ baca to upozorenje da su continue & break isti vrag unutar switch statementa.

Sada još jedino nebi bilo loše skužiti što su autori gornjeg codea željeli reći… pošto oni koriste unutar tog switcha i “continue” i “break” … a oboje se ponaša jednako unutar switch statementa.

Pa da nisu oni možda htjeli pisati “continue 2”? … ali ni to nema smisla kada se u petlji ne nalazi ništa nakon toga switcha, pa se code nebi drugačije u ovom slučaju ponašao niti da je pisano “continue 2”.

Pa ispada da autori nisu baš imali razlog zašto negdje koriste “break”, a negdje “continue”, kada je isti vrag…

Osim ako ne čitaš dokumentaciju (ili poslušaš nekog ko je čita i razumije: i.e. mene):

Jbg, ti ne želiš uraditi onako kako ti se kaže, čak ni pokušati pa javiti šta je bilo u redu il’ šta nije.
Srećno u daljem rješavanju problema.

Nisi me razumio, shvatio sam ja razliku između continue i continue 2.

Ali u ovom konkretnom primjeru codea koji su ostavili autori imaš situaciju da se ništa u petlji ne nalazi nakon switch statementa…pa prema tome u ovom konkretnom primjeru i da se stavi “continue 2”, ne postoji code koji će time biti preksočen.

Tako da u konkretnom primjeru stavi li se continue; break ili continue 2 … rezultat codea će biti u potpunosti isti…

Postaje teško pisati s tobom.

Još sam ti nacrt’o u prethodnom postu:

If you have a switch inside a loop and wish to continue to the next iteration of the outer loop, use continue 2 .

I egzaktno baš to imaš - switch u foreach-u.
Čime se ti baviš i kakvim razmišljanjima nec2u ulaziti al’ ne idu u logičnom smjeru rješavanja zadatog problema. Zato mi je mučno pokušavati ti pomoći kad ne želiš da uložiš minimum napora i sam.

Na kraju krajeva, prelistaj sve probleme koji su pratili taj plugin za prevod na wp sajtu i github-u pa vidi kako su drugi rješavali. Odjavljujem se.

Ne kužim iskreno koji je tvoj problem.

Sve je jasno, problem je davno rješen. Dao si ok dokumentaciju i problem je solved od tog momenta. Čak i prije toga.

Samo velim da mi nije jasno što su autori codea htjeli postići stavljanjem i varijacije “continue” i “break” unutar istog switch statementa, kada obje naredbe imaju isto značenje na tom mjestu. Očito je da ni sami nisu znali. :slight_smile:

A čak da su stavili i “continue 2”, u konkretnom komadu code-a se ništa drugačije nebi izvršavalo.

žž.

… Post must be at least 20 characters

Ostadođe još jedna nejasnoća… što ne valja sa ovim code-om za php7+

function replace_meta_widget()
{
unregister_sidebar_widget ('meta');
$widget_ops = array('classname' => 'widget_meta', 'description' => __( "Log in/out, admin, feed and WordPress links") );
wp_register_sidebar_widget('meta', __('Meta'), 'wp_widget_meta_modified', $widget_ops);
}

add_action('widgets_init',replace_meta_widget);

To je inače iz plugina: Customize Meta Widget
A warning koji baca PHP nakon updejta je:

Warning: Use of undefined constant replace_meta_widget - assumed ‘replace_meta_widget’ (this will throw an Error in a future version of PHP) in …/wp-content/plugins/customize-meta-widget/customize-meta-widget.php on line 21

Pa ako netko zna o čemu je riječ, bit ću zahvalan.
Ako me ne misli izjesti nakon što pomogne. :smiley: :smiley: …ma bit ću i tada zahvalan. :slight_smile:

add_action('widgets_init', 'replace_meta_widget');
1 Like

Kakav besmislen plugin. Sta nisi mogao sloziti sam menu i postaviti ga “menu widgetom”?

Nit sam ja radio te stranice…niti znam što je na njima. Samo ih re-hostam, a kako je moj host izbacio podrsku za php5 morao sam na sto brzi i bezbolniji nacin azurirat 50ak stranica. Nisam proucavao sto je na njima.